zoukankan      html  css  js  c++  java
  • 要慎用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叫索引的势太低,其查询效果不太好

  • 相关阅读:
    JSP自定义标签_用简单标签控制标签体执行10次
    JSP自定义标签_用简单标签实现控制标签体是否执行
    eclipse 使用lombok 精简java bean
    转 :关于springmvc使用拦截器
    转: spring静态注入
    spring 4.0+quartz2.2 实现持久化
    排除maven jar冲突 maven tomcat插件启动报错 filter转换异常
    转 Quartz将Job持久化所需表的说明
    转 maven jetty 插件
    ORA-14300: 分区关键字映射到超出允许的最大分区数的分区
  • 原文地址:https://www.cnblogs.com/-mrl/p/5096447.html
Copyright © 2011-2022 走看看