>我在表中有一行是枚举类型,但默认情况下也可以为 NULL。
空字符串(''
(不是可能的枚举值之一,但是,一段时间后,我发现所有我认为为null的条目实际上都设置为空字符串。
解决这个问题不是问题。但是,我愿意首先知道这是怎么发生的,-以确保我不会再得到任何这些,-但到目前为止,我还没有能够重新创建带有空字符串作为值的新条目。
我有什么会导致枚举值既不设置为 null 也不设置为任何可能的值?
如果有人尝试将一个值插入到枚举中,该值不在其定义的值列表中,并且未强制执行严格模式,则该值将被截断为''
。
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 说:
严格模式在尝试创建超过最大密钥长度的密钥时会产生错误。如果未启用严格模式,则会导致警告并将密钥截断为最大密钥长度。
它没有明确说明,但"超过最大长度"还包括"不是枚举的元素"。