我在表中有一行是枚举类型,但默认情况下也可以为NULL
空字符串(''
)不是可能的枚举值之一,然而,经过一段时间后,我发现我认为为null的所有条目实际上都设置为空字符串。
解决这个问题并非如此。但是,我很想知道这首先是怎么发生的 - 为了确保我再也不会得到这些, - 但到目前为止我还没有能够使用空字符串作为值重新创建新条目。
我有什么能够将枚举值既不设置为null也不设置任何可能的值?
答案 0 :(得分:0)
如果有人试图将值插入不在其定义的值列表中的枚举,并且未强制执行严格模式,则该值将被截断为''
。
mysql> create table t (e enum('a','b','c'));
mysql> insert into t set e='d';
ERROR 1265 (01000): Data truncated for column 'e' at row 1
mysql> set session sql_mode=''; -- disable strict mode
mysql> insert into t set e='d';
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> show warnings;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'e' at row 1 |
+---------+------+----------------------------------------+
mysql> select * from t;
+------+
| e |
+------+
| |
+------+
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html说:
严格模式会在尝试创建超过最大密钥长度的密钥时产生错误。如果未启用严格模式,则会导致警告并将密钥截断为最大密钥长度。
它没有明确说明,但是"超过最大长度"还包括"不是枚举的元素。"