2014-11-25 83 views
0

讓我們創建表爲什麼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

回答

2

最有可能您的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

相關問題