2011-11-17 150 views
8

我想了解如何在MySQL中使用枚舉。 如果我插入任何枚舉字段超出枚舉類型 - mysql插入空字符串(值爲0)。MySQL枚舉空值

  • 果實ENUM('APPLE','BANANA','PEACH');
  • INSERT ...水果= 'BANNANA'

簡單的拼寫錯誤和MySQL插入空值,打破了數據庫的完整性,使枚舉非常無用。

CHECK約束可以幫忙,但是MySQL不支持他們(很有趣在2011年「最受歡迎」的數據庫)

我看到的唯一方法是編寫觸發器,以防止空字符串,但實在是太多了爲這樣一個簡單的案例寫作觸發器。

是否有辦法禁用「空字符串」的MySQL行爲的枚舉?

感謝

回答

4

看看SQL模式

SET SQL_MODE='TRADITIONAL'; 
8

由於每documentation:

如果插入了無效的值插入ENUM(即字符串中的列表中不存在的允許值),則將插入空字符串作爲特殊錯誤值。由於該字符串的數值爲0,因此該字符串可以與「正常」空字符串區分。

在旁註中,我建議您避免枚舉,因爲它們效率不高。

如果您確實需要枚舉,請考慮使用嚴格模式。當您嘗試將無效值插入ENUM列時,嚴格模式至少會引發錯誤。否則,只會引發警告,並將值簡單地設置爲空字符串''(內部引用爲0)。注意:如果使用IGNORE,在嚴格模式下錯誤仍然可以被抑制。

這裏是鏈接到documentation on setting your MySQL server mode

快樂編碼!

更新: Nick的答案是以嚴格模式設置服務器的一種方法。 TRADITIONAL模式相當於STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,因此請記住,您將在其他數據類型(例如DATE)上執行其他數據驗證。