为什么MySQL隐式地将没有数据转换为空字符串?

时间:2014-11-25 00:06:31

标签: mysql string null

让我们创建表

CREATE TABLE IF NOT EXISTS `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `data1` varchar(64) NOT NULL, `data2` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

并粘贴一些数据

INSERT INTO `test` (`data1`) VALUES ('111');

我们没有指定data2,但已插入行。字段data2的值为空字符串。为什么插入没有失败?这是一个错误吗?

mysql Ver 14.14 Distrib 5.6.19,for debian-linux-gnu(x86_64)

1 个答案:

答案 0 :(得分:2)

您的sql_mode很可能不包含STRICT_TRANS_TABLES,这将允许执行插入,您将收到警告而不是错误。

你可以检查你的sql_mode变量

SHOW VARIABLES LIKE 'sql_mode';

如果您不想要这种行为,可以像这样更改您的sql_mode

-- change sql_mode only for the current session
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

如果您希望此更改影响整个服务器,那么<​​/ p>

-- change the sql_mode for the entire server.
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

如果要为整个服务器更改它。然后你还需要添加更新你的my.ini文件

查找以sql-mode =

开头的行

并将其替换为

sql-mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

更新my.ini文件将阻止服务器在重新启动后恢复。