首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

一个因逻辑不兼容挑动的惨案

2012-07-04 
一个因逻辑不兼容引发的惨案最近新安装了个MySQL最新版本(MySQL 5.5.20)的数据库,是用安装形式的,安装很简

一个因逻辑不兼容引发的惨案
最近新安装了个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 strictsql-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;        -> 0mysql> 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

热点排行