日期:2014-05-16  浏览次数:20407 次

一个因逻辑不兼容引发的惨案
最近新安装了个MySQL最新版本(MySQL 5.5.20)的数据库,是用安装形式的,安装很简单,一切OK后,因接手一项目,导入其数据后在本机测试,数据插入总是有问题,但同样的程序和插入SQL在以前的服务器上就没问题,总是提示类似下面的错误。
mysql>INSERT INTO users SET email="foobar@example.com", 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