mysql>INSERT INTO users SET email="[email protected]", username="foobar", password="secret"; ERROR 1364 (HY000): Field 'tags' doesn't have a default value
查看users表结构
mysql> desc users; +----------------+---------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+---------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO | PRI | NULL | auto_increment | | username | varchar(32) | NO | UNI | NULL | | | password | varchar(32) | NO | | NULL | | | email | varchar(256) | YES | UNI | NULL | | | tags | varchar(255) | NO | MUL | NULL | | +----------------+---------------------+------+-----+---------+----------------+ 50 rows in set (0.01 sec)
能够看出tags字段是要求“非空”没有默认值的,而且在插入语句中也没有赋值,看起来应该是插入语句的问题,但在我接手这个项目之前程序一直也是这么跑的,怎么现在在我本机上就不行了呢?找了好久的解决方法(此处略去3000字…)
终于在网上找到了有关这样的说明,原来在MySQL配置文件中有个关于 Server SQL Mode 的设置,而这个设置默认没有特别的模式设置(也就是在my.ini中没有sql-mode="mode"的设置),但我是用安装包来安装,在my.ini中就有了这样的设置
# Set the SQL mode to strict sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
将这条注释掉并重启MySQL服务器,上面的问题就解决了。
更多关于Server SQL Mode的介绍
Server SQL Mode是MySQL应该支持什么样的SQL语法,应该执行什么样的数据验证,这使得MySQL数据库可以在不同的环境和不同的数据库之间一起,以便用于不同的客户端使用。
可以使用
SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
查看使用了哪些模式或在执行中更改模式
mysql> SET sql_mode = ''; mysql> SELECT NOT 1 BETWEEN -5 AND 5; -> 0 mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE'; mysql> SELECT NOT 1 BETWEEN -5 AND 5; -> 1
参见: http://dev.mysql.com/doc/refman/5.5/en/faqs-sql-modes.html