• 要慎用mysql的enum字段的原因


    PHP低级编程的兄弟是这样来看这个问题的,我作下笔录如下,期望能客观的理解这个enum字段的优点及缺点:

    膘哥观点:
        enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ..... set a= 1,你没法知道你是想 a= '1' 还是 a= 1(a='1'是插入值1,a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号。),这是PHP和 mysql 在使用enum 最大的问题。所以。。安心点啦。干脆点直接tinyint。

    单曲观点:
        我觉得没什么优点,对数字型的enum,简直就是梦魇,boolean  tinyint(1) 0,1 status  tinyint(1)  1,2,3,4,5,6..tinyint欢淫你~~。如:audit_result enum(1,2,3),set audit_result = 1;...容易出现膘哥所说的混淆。

    简单观点:
       少用,一般都是用tinyint替代。

    天枫观点:
       我觉得除了状态直观  没什么优点,我一般直接int,tinyint([1or2or3]) 到底有啥区别?(后面会简单探讨下,这里面的1or2or3区别。)

    中庸观点:
       a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号,基本上是不加引号的。

    竖琴螺观点:
       六种情况就:tinyint(1)  -1,-2,1,2,3,4

    上面各种观点重点集中在PHP这种弱类型语言对引号不重视,程序员不写容易引起插入的语句不是自己想要的结果的问题,容易出现int时没有用引号导致插入了新值而不是定的那个值:

    表结构如下: 

    1
    2
    3
    4
    5
    CREATE TABLE `enum2tinyint` (
     `switchs` enum('none','success','fail','delete','skip','1') DEFAULT NULL,
     `switch` tinyint(1) NOT NULL,
     KEY `switchs` (`switchs`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

     
    正常带引号插入enum: 

    1
    2
    INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES ('1', '1');
    1 1

    PHP的弱类型问题,特别是对int类型的情况,实践如下: 
    如果没有带引号插入enum字段后如下(是第一个值none): 

    1
    2
    INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES (1, '1');
    none 1

    如果没有带引号插入enum字段后如下(是第2个值success): 

    1
    2
    INSERT INTO `test`.`enum2tinyint` (`switchs`, `switch`) VALUES (2, '1');
    success 1


    结论:要插入enum的值,字段必须加引号,不加引号当然是数字,数字就是key,不是value。

    规劝:
    1)enum是整型这样的错误很容易发生,尤其是php弱类型的,一般新来一个人,没注意enum类型,就会犯错。
    2)数据库说明清楚的话,或者可选择的全是字符串的话,还没什么,但是里面有数字,难免有新手犯错,养成加引号的习惯很重要。

    最终结论:
    历史原因,要把enum改成tinyint程序改动太大了,用了的没必要改·~,以后新建的时候,尽量使用tinyint就好。
    这种字段的重复内容过多的,索引建不建,关系不大,这种在mysql叫索引的势太低,其查询效果不太好

    https://www.cnblogs.com/-mrl/p/5096447.html

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/lxwphp/p/9804984.html
Copyright © 2020-2023  润新知