一个因逻辑不兼容引发的惨案

最近新安装了个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


参见:[url]http://dev.mysql.com/doc/refman/5.5/en/faqs-sql-modes.html[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值