2009-12-08 44 views
11

我試圖創建一個簡單的'是'/'可能'/'沒有'枚舉在MySQL中與PhpMyAdmin 我設置NULL爲否,作爲默認值MySQL Enum的始終包含''(空字符串)的可能性

我期待執行類似「SET EnumCol =''」時出錯,因爲''(空字符串)不應該是有效值。 但是查詢得到執行並且值被設置爲'' - 這意味着每當我從數據庫讀取數據時,我都會強制檢查這個不需要的和非法的值!

這是MySQL或PhpMyAdmin中的錯誤嗎? 有誰知道禁用此行爲的方法?

謝謝。

回答

19

空字符串爲ENUM中的無效值的錯誤指示符。從MySQL ENUM type manual

如果將一個無效值插入ENUM(也就是說,在允許值的列表中不存在的字符串),空字符串被插入,而不是作爲一個特殊的錯誤值。該字符串可以與「普通」空字符串區分開來,因爲該字符串的數值爲0.更多信息,請參閱後面的內容。

要禁用此行爲:

如果啓用嚴格的SQL模式,試圖插入無效枚舉值導致錯誤。

要啓用嚴格模式,請參閱Server SQL Modes

-2

ENUM的屁股很痛苦。除非你還需要用數字來設置值,否則我會遠離它們。而是使用帶查找表的外鍵的varchar列來限制值。這將導致無法插入一個不好的值。

+0

但'ENUM'類型的操作會比外鍵檢查更快。 – 2009-12-08 17:34:42

+3

是真的。但誰在乎?這可能不是一個每分鐘有10K插入的應用程序,切換到枚舉將提高性能。選擇枚舉速度超過外鍵是一種過早優化的情況。 – longneck 2009-12-08 18:37:05

+0

我欣賞這種使用FK查找表的替代解決方案。它看起來也更具可擴展性。 – 2016-11-29 02:37:20