慎使用sql的enum字段类型

  在sql的优化中,会有同学提到一点:使用enum字段类型,代替其他tinyint等类型。以前这也是不少人喜欢优化的,但是现在细想,是非常不合理的。

  优点:

  1.可以设置区间范围,比如设置性别:1男2女3未知。如果这是出现一个非1、2、3类型的,一眼就是脏数据了。

  缺点:

  1.数据迁移的时候,他几乎不可能被其他数据库所支持,如果enum里面是字符串,对于其他数据库来说就更郁闷了,还不能设为tinyint等类型的字段(enum虽然可以存储字符串,但对于内部来说,还是以顺序进行索引,比如‘a‘,‘b‘,‘c‘,我们也可以用索引值来获取值select * from tbl_name whre enum = 2,这与select * from tbl_name where enum = ‘b‘等义)如果你看明白了这两句SQL为什么等义,那么你也就可以了解为什么不主张用enum字段了。

  2.如果一个设计不合理的ENUM字段,比如一个enum字段的范围是(‘0‘,‘1‘,‘2‘,‘3‘),这时候,你会不会哭呢?要知道enum的枚举值对应的索引是从1开始的。比如:执行INSERT INTO test1(id, sex) VALUES (1, 1);表中实际存储你就会发现,你插入的并不是1,而是0。

  3.更有甚者,由于enum的区间也是可以变动的,如果你在enum的枚举字段范围中加一个值,并且不是加在最后,那么也就相当于,你把原来的范围都改变了索引值,试想这又是多么一个恐怖的事情?

  

  总结:

  如果你的系统中真的已经使用了mysql的enum字段类型,请在查询的时候直接查询值(并加上单引号),这样就不会使用enum自身隐藏的索引值来获取结果了。【顺便说一下,enum的默认索引是从NULL开始,如果你允许NULL并default NULL】

  建议:

  如果字段是字符串,并且长度固定,可以尝试用char,如果是数值型,还是用tinyint<只占一个字节>吧,比较安全稳定,而且即使迁移,问题也不大。

如有错误,欢迎热心指正。

  

原文地址:https://www.cnblogs.com/luoliuniankk/p/9763880.html

时间: 2024-10-26 19:10:46

慎使用sql的enum字段类型的相关文章

MYSQL SET ENUM字段类型

show create table stu;//显示建表语句 create table t1(t enum('a','b','c')); insert into t1 values('a'); create table t2(t  set('a','b','c')); insert into t2 values('a,b'); MYSQL SET ENUM字段类型

SQL Server数据库字段类型说明

目前Sql Server 数据库一共有X个字段类型,大体分为9类,分别是字符串类型.二进制码字符串数据类型.Unincode字符串数据.整数类型.精确数据类型.近似值浮点数值数据类型.日期时间数据类型.货币数据类型.特殊数据类型.当然Sql Server还提供用户自定义的数据类型,但在我这篇不做讨论. 字符串类型 Char char数据类型用来存储指定长度的定长非统一编码型的数据.当定义一列为此类型时,你必须指定列长.当你总能知道要存储的数据的长度时,此数据类型很有用.例如,当你按邮政编码加4个

SQL SERVER中字段类型与C#数据类型的对应关系

数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal float System.Double image System.Byte[] money System.Decimal nchar String ntext String numeric System.Decimal nva

SQL Server中字段类型对应的C#中的数据类型

  数据库  C#程序  int                int32  text string bigint int64 binary System.Byte[] bit Boolean char string datetime System.DateTime decimal System.Decimal  float System.Double image  System.Byte[]  money System.Decimal nchar String ntext String  nu

sql 2005 数据库字段类型说明

数据类型 类型 描              述 bit 整型 bit 数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或Fa lse .On 或Off int 整型 int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数.存储到数据库的几乎所有数值型的数据都可以用这种数据类型.这种数据类型在数据库里占用4个字节 smallint 整型 smallint 数据类型可以存储从- 21

SQL Server 的字段类型

数据库中存储的信息主要有:数字.时间.文字.图片.唯一标示等. 针对数字有:bit,tinyint,smallint,int,long,decimal,float.长度从一个位逐个字节(8位)的增加. 时间:date,datetime. 文字:char,varchar,nvarchar. 唯一标示有:timestamp,uniqueidentifier

sqlserver字段类型

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

【DataBase】sqlserver字段类型详解

bit    整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint   整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值时很有用.这种数据类型在数据库中占用1 个字节. 注意:如果bit类型太单调不能满足您的需求,您可以考虑用tinyint类型,因为这个类型相对也是比较安全的

sqlserver字段类型详解

抄了一篇不错的数据库类型,来自:http://www.cnblogs.com/andy_tigger/archive/2011/08/21/2147745.html bit 整型 bit数据类型是整型,其值只能是0.1或空值.这种数据类型用于存储只有两种可能值的数据,如Yes 或No.True 或False .On 或Off. 注意:很省空间的一种数据类型,如果能够满足需求应该尽量多用. tinyint 整型 tinyint 数据类型能存储从0到255 之间的整数.它在你只打算存储有限数目的数值