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

问题描述:

让我们创建表为什么MySQL将没有数据隐式转换为空字符串?

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版本14.14 DISTRIB 5.6.19,为Debian的Linux-GNU(x86_64的)

+0

你的sql_mode设置为什么? 你可以发现,通过检查'show variables like'sql_mode''你的sql_mode可能被设置为空,这允许。但你会得到一个警告。 – Jaylen 2014-11-25 00:14:56

+0

我系统中的sql_mode是NO_ENGINE_SUBSTITUTION。只发现一个变量。它的默认配置 - 我没有改变任何东西,因为我的系统上的安装 – 2014-11-25 00:25:44

最有可能您的sql_mode不包含STRICT_TRANS_TABLES这将允许执行的插入,你会得到一个警告,而不是一个错误..

您可以检查像这样

SHOW VARIABLES LIKE 'sql_mode'; 

您的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'; 

,如果你想这种变化会影响整个服务器,然后

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

如果你想改变它为整个服务器。然后,你还需要与

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

更新my.ini文件会阻止服务器恢复添加更新您的my.ini文件

查找以sql-mode =

开头的行并更换重新启动后重新启动。

+0

sql_mode是NO_ENGINE_SUBSTITUTION。只有一个价值。这是默认的mysql配置 – 2014-11-25 00:27:59

+0

好吧,像我上面提到的那样改变它,这会给你想要的结果。 – Jaylen 2014-11-25 00:29:02

+0

它的工作原理。谢谢 – 2014-11-25 00:41:28