当前位置: 首页 > news >正文

MySQL慎用 ENUM 字段

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

前言:在网上看了很多文章,大家都是推荐 MySQL 要慎用 ENUM 字段,但是原理感觉还是有点模糊。今天我们就从官网来818这些东西

 

1、关于 ENUM 迁移的问题?

这里引用别人的一段话:但ENUM带来的问题也不少,比如数据迁移的时候,他几乎不可能被其他数据库所支持,如果 ENUM 里面是字符串,对于其他数据库来说就更郁闷了,还不能设为tinyint等类型的字段

 

2、关于 ENUM 索引的问题?

纯数字类型的不建议用枚举类型,这是因为在 ENUM 内部维护有一个隐形的索引,也是按数字排列的,容易混淆;添加枚举值也是一个问题,如果添加在最后还好,如果添加在中间什么位置的话,原来的隐藏索引将不再起作用

Index Values for Enumeration Literals

Each enumeration value has an index:

The elements listed in the column specification are assigned index numbers, beginning with 1.

The index value of the empty string error value is 0. This means that you can use the following SELECT statement to find rows into which invalid ENUM values were assigned:

mysql> SELECT * FROM tbl_name WHERE enum_col=0;
The index of the NULL value is NULL.

The term “index” here refers to a position within the list of enumeration values. It has nothing to do with table indexes.

For example, a column specified as ENUM('Mercury', 'Venus', 'Earth') can have any of the values shown here. The index of each value is also shown.

Value	Index
NULL	NULL
''	0
'Mercury'	1
'Venus'	2
'Earth'	3
An ENUM column can have a maximum of 65,535 distinct elements. (The practical limit is less than 3000.) A table can have no more than 255 unique element list definitions among its ENUM and SET columns considered as a group. For more information on these limits, see Section C.10.5, “Limits Imposed by .frm File Structure”.

If you retrieve an ENUM value in a numeric context, the column value's index is returned. For example, you can retrieve numeric values from an ENUM column like this:

mysql> SELECT enum_col+0 FROM tbl_name;
Functions such as SUM() or AVG() that expect a numeric argument cast the argument to a number if necessary. For ENUM values, the index number is used in the calculation.

 

3、ENUM 字段 NULL 值问题

ENUM 字段默认是可以插入 NULL 值的,这个就比较尴尬了,而且没有办法优化

 

4、插入的值问题

如果插入的值比ENUM设定的值大,会默认保存成接近的那个值;插入的值不能包含函数,不能传递参数

numbers ENUM('0','1','2')

mysql> INSERT INTO t (numbers) VALUES(2),('2'),('3');
mysql> SELECT * FROM t;
+---------+
| numbers |
+---------+
| 1       |
| 2       |
| 2       |
+---------+

 

所以如果插入的值是数字型的,建议用tinyint,如果插入的值是字符型的,建议用char。如果真想用 ENUM 也是可以得,前提是要了解到 ENUM 的弊端,就可以有效规避这些问题

参考文档:https://dev.mysql.com/doc/refman/5.7/en/enum.html#enum-limits 

为了方便大家交流,本人开通了微信公众号,和QQ群291519319。喜欢技术的一起来交流吧

转载于:https://my.oschina.net/u/3023401/blog/1439064

相关文章:

  • mysql取差集、交集、并集
  • Tex: The top-level auxiliary file: *.aux I couldn't open style file IEEEtran.bst 解决方法
  • 【java项目实战】一步步教你使用MyEclipse搭建java Web项目开发环境(一)
  • 嵌入式开发之hisilicon---hi3536 处理器简介
  • 分布式开放消息系统(RocketMQ)的原理与实践
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • nodeJS中的包
  • oracle学习3
  • 即将到来的Android N,将具备这些新特性
  • 三层架构—简析
  • kibana 常用查询方法
  • 利用linux shell自己主动顶贴
  • 最全肌肉锻炼动图
  • C++标准转换运算符static_cast
  • 存储“芯”突破口 解析3D NADN产业竞争形势
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • Angular 响应式表单 基础例子
  • axios 和 cookie 的那些事
  • JavaScript HTML DOM
  • JAVA并发编程--1.基础概念
  • Java教程_软件开发基础
  • magento 货币换算
  • NSTimer学习笔记
  • SpringCloud集成分布式事务LCN (一)
  • spring学习第二天
  • Vue官网教程学习过程中值得记录的一些事情
  • vue脚手架vue-cli
  • 彻底搞懂浏览器Event-loop
  • 关于extract.autodesk.io的一些说明
  • 回顾2016
  • 聊聊sentinel的DegradeSlot
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 微信小程序填坑清单
  • 白色的风信子
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • $L^p$ 调和函数恒为零
  • (09)Hive——CTE 公共表达式
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (4)STL算法之比较
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (未解决)macOS matplotlib 中文是方框
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .FileZilla的使用和主动模式被动模式介绍
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net mvc部分视图
  • .NET MVC第三章、三种传值方式
  • .NET Project Open Day(2011.11.13)
  • .net 获取url的方法