【问题标题】:Enum value is not set, BUT is not null未设置枚举值,但不为空
【发布时间】:2017-07-21 00:45:07
【问题描述】:

我的表中有一行是枚举类型,但默认情况下也可以为 NULL。
空字符串 ('') 不是 可能的枚举值之一,但是,一段时间后,我发现我认为为 null 的所有条目实际上都设置为空字符串.

解决这个问题不是问题。但是,我很想知道这甚至是如何发生的,-以确保我再也不会得到这些,-但到目前为止,我还没有能够重新创建一个空的新条目字符串作为值。

我有什么办法会导致枚举值既不设置为 null 也不设置为任何可能的值?

【问题讨论】:

    标签: mysql sql enums phpmyadmin null


    【解决方案1】:

    如果有人试图向枚举插入一个不在其定义的值列表中的值,并且未强制执行严格模式,则该值将被截断为''

    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 说:

    严格模式会在尝试创建超过最大密钥长度的密钥时产生错误。如果未启用严格模式,这会导致警告并将密钥截断为最大密钥长度。

    没有这么明确的说,但是“超过最大长度”还包括“不是枚举的元素”。

    【讨论】:

    • 根据我的测试表现,我认为严格模​​式实际上已启用。查询 sql_mode 后,我发现 STRICT_TRANS_TABLES 等等,但没有 STRICT_ALL_TABLES。仅此一项就允许这种行为吗?
    • 如果您的表使用 InnoDB 引擎,则 STRICT_TRANS_TABLES 适用。如果您的表使用任何引擎(即 InnoDB 和 MyISAM 以及任何其他引擎),则适用 STRICT_ALL_TABLES。在我链接到的 sql-mode 手册页中阅读更多内容。
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多