慎使用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<只占一个字节>吧,比较安全稳定,而且即使迁移,问题也不大。
如有错误,欢迎热心指正。
慎使用sql的enum字段类型的更多相关文章
- 修改SQL数据库中表字段类型时,报“一个或多个对象访问此列”错误的解决方法
在SQL数据库中使用SQL语句(格式:alter table [tablename] alter column [colname] [newDataType])修改某表的字段类型时,报一下错误:由于一 ...
- FIREDAC不能识别SQL的某些字段类型
FIREDAC不能识别SQL的某些字段类型 经常见有网友有类似的提问:请问各位,在DataSnap中使用SQL数据SUM函数,如果是统计浮点型数值的话,返回是乱码,哪位是什么原因? 其实这不是DAT ...
- Oracle使用SQL语句修改字段类型
Oracle使用SQL语句修改字段类型 1.如果表中没有数据 Sql代码 1 2 3 alter table 表名 modify (字段名1 类型,字段名2 类型,字段名3 类型.....) alt ...
- SQL Server数据库字段类型说明
SQL Server数据库字段类型说明 目前Sql Server 数据库一共有X个字段类型,大体分为9类,分别是字符串类型.二进制码字符串数据类型.Unincode字符串数据.整数类型.精确数据类型. ...
- SQL语句修改字段类型与第一次SQLServer试验解答
SQL语句修改字段类型 mysql中 alert table name modify column name type; 例子:修改user表中的name属性类型为varchar(50) alert ...
- SQL数据库中字段类型 与C#中的对应字段类型
数据库中的字段类型和对应的C#中的对应字段类型 数据库 C#程序int int32text stringbigint int64binary System.Byte[] ...
- SQL Server中字段类型对应的C#中的数据类型
数据库 C#程序 int int32 text string bigint int64 binary System.Byte[] bit Boolean cha ...
- sql语句修改字段类型和增加字段
/*修改字段类型*/ ) go /*增加字段和说明*/ ) EXECUTE sp_addextendedproperty N'MS_Description','说明文字',N'user',N'dbo' ...
- SQL读取XML字段类型的信息
USE CSOS_NEW_2 GO --(1)定义临时表 DECLARE @table TABLE(id INT IDENTITY(1,1),XMLDetail XML) DECLARE @xml X ...
随机推荐
- ES入门——数组的扩展
1.Array.from() 该方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象,包括ES6新增的数据结构Set和Map.下面是 ...
- Echarts实现隐藏x轴,y轴,刻度线,网格
"yAxis": [ { //就是一月份这个显示为一个线段,而不是数轴那种一个点点 "show" : true, "boundaryGap" ...
- Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101
视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...
- DedeCms织梦后台管理员密码修改和忘记重置方法
方法/步骤 打开dede_admin数据表: 进入你的MYSQL后台,然后在你的数据库名中,找到dede_admin这项如图,pwd下的值就是你的密码,织梦密码采取的是MD5加密,破解麻烦而且没有必要 ...
- jquery之---$.each详细
jQuery.each()函数用于遍历指定的对象和数组,并以对象的每个属性(或数组的每个成员)作为上下文来遍历执行指定的函数. 语法 静态函数$.each()的语法如下:$.each( object, ...
- hearbeat
heartbeat介绍: 作用: 通过heartbeat,可以将资源(IP及程序服务等资源)从一台已经故障的计算机快速转移到另一台正常运转的机器上继续提供服务,一般称之为高可用服务.在升级生产应用场景 ...
- 用phpstudy搭建的lnmp环境下mysql授权远程连接
1.使用phpstudy安装的mysql没有放置到可以直接调用的目录里,所以只能使用绝对路径来访问: /phpstudy/mysql/bin/mysql -uroot -proot 2.执行use m ...
- YII2.0安装教程,数据库配置前后台 [ 2.0 版本 ]
1.首先下载yii-advanced-app-2.0.6.tgz 2.解压到D:\wamp\www\yii2目录下面将目录advanced下所有文件剪切到 D:\wamp\www\yii2 3.打开c ...
- 【深入理解JAVA虚拟机】第三部分.虚拟机执行子系统.2.虚拟机类加载机制
1.概述 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验. 转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 2.类加载顺序 类从被加载到虚拟 ...
- ArcSde服务启动后又停止
问题:突然发现ArcSde服务无法启动,“ArcSde服务启动后又停止,......” 环境:Win7+ArcSDE10 +Oracle11g 由于本人使用ArcSde时间不长,基本没有遇到过什么问题 ...