MySQL 中,对于那些取值只有两三个,或者五个以内的值,想必,大多数人使用的应该都是 ENUM 类型吧,而剩下的另一部分人,应该都是使用 TINYINT(1) 。 我,就是剩下的那部分人。

一方面我真的是太懒,虽然 MySQL 提供了丰富的数据类型,但我用到的真心不多,也就那么几个 INT(11)、TINYINT、VARCHAR 和 TEXT。

我为什么不用 ENUM 类型?

因为我在入门的时候,就跳进了一个大窟窿,而且久久未上岸。

事情的经过是这样的:

1、假设我们要保存的一列只有两个值 true 和 false ,那么我们第一时间想到的,自然是使用 enum('T','F') 来表示对吧

所以,我们创建了下面这个表

CREATE TABLE `b` (

`k` ENUM('T','F') NOT NULL

);

简单起见,我们只有一个字段

2、创建成功后,我们就会往里面插入数据,当然了,我们并不按正常套路出牌,而是使用下面的 SQL 语句

INSERT INTO `b` (`k`) VALUES ('W'), ('T'), ('F');

这条语句能执行成功吗?

显然,不能的

执行的结果为

ERROR 1265 (01000): Data truncated for column 'k' at row 1

这在最新的 MySQL 版本是直接报错的,因为最新的几个 MySQL 版本都开启了严格模式。

如果关掉严格模式,或者使用比较古老的版本,仅仅是发出了一个警告而已

Query OK, 3 rows affected, 1 warning (0.00 sec)

Records: 3 Duplicates: 0 Warnings: 1

我们可以使用 SHOW WARNINGS; 语句查看刚刚的警告

mysql> SHOW WARNINGS;

+---------+------+------------------------------------------+

| Level | Code | Message |

+---------+------+------------------------------------------+

| Warning | 1265 | Data truncated for column 'k' at row 1 |

+---------+------+------------------------------------------+

1 row in set (0.00 sec)

当然了,如果你以为数据是正确插入的,可就大错特错了,看看下面的语句

mysql> SELECT COUNT(DISTINCT k) FROM b;

+---------------------+

| COUNT(DISTINCT k) |

+---------------------+

| 3 |

+---------------------+

1 row in set (0.00 sec)

是不是大跌眼镜,原则上来说,应该仅仅只有两个不一样的值 T 和 F ,而 W 竟然也能插入成功

对于这个问题,MySQL 官方还是作出了一点的解释的

「如果在 ENUM 列中插入无效值(即,允许值列表中不存在的字符串),则会插入空字符串 ( '' ) 作为特殊错误值,这个空字符串可以通过此字符串具有数字值 0 来区分 正常 的空字符串 」

是不是很绕口,很简单的规则,就是说如果往 enum 列中插入了无效的值,可以被插入,但插入的是一个特殊的空字符串,而该空字符串的数值是 0

所以,使用 enum 就要很小心了。

就因为这个原因,我始终没有碰 enum ,当然了,另一个原因是如果要添加其它允许的值,则需要修改默认表结构,这,往往是得不偿失的。

本章节,我们就来讲讲这个臭名昭著的 enum 类型。

MySQL ENUM 数据类型

1、首先,要说的是「 ENUM 类型其实是一个字符串类型 」,虽然作用很像 C 或 C++ 中的枚举类型。

2、其次,要说明的是,ENUM 类型的值都是从 允许值列表中选择

3、再次,允许值 列表在创建表结构时就定义好的,表创建完成后可以使用 alter 语句来修改允许值列表

ENUM 数据类型能够带来很多好处,比如

1、数据更紧凑。因为 ENUM 列一般都是有限的值,一般不多余 5 个这样,这就比保存 true 或 false 节省空间多了。因为 MySQL 会在创建或者修改表结构时将 enum 允许的值自动编码为数字,而这个数字一般的分配空间为 1~2 字节 ( byte ) ,具体取决于实现。

例如,将值为 medium 的100万行插入表将需要 100 万字节的存储空间,而如果将实际字符串 medium存储在 VARCHAR 列中则需要 600 万字节。

2、更好的可读性,虽然在存储的是数字,但在输入和输出时使用的都是对应的允许值。

虽然 enum 有这两个极大的好处,但也有不少的坏处,前面提到的就是其中之一

至于具体有哪些坏处,我们下一章节再来阐述吧

干货推荐

附录:MySQL 拾遗:系列文章

enum mysql byte_九、臭名昭著的 MySQL ENUM 类型 ( 上 )相关推荐

  1. MySQL 中的 SET 与 ENUM 类型使用详解

    一.SET类型 在创建表时,就指定SET类型的取值范围. [sql] view plaincopy 属性名 SET('值1','值2','值3'...,'值n') 其中,"属性名" ...

  2. Java、Mysql、MyBatis 中枚举 enum 的使用

    From: https://yulaiz.com/java-mysql-enum/ Java 和 MySql 中都有枚举的概念,合理的使用枚举,可以让代码阅读和数据库数据查询更加直观.高效.那么我们怎 ...

  3. mysql 禁止使用enum_MySQL慎用 ENUM 字段

    前言:在网上看了很多文章,大家都是推荐 MySQL 要慎用 ENUM 字段,但是原理感觉还是有点模糊.今天我们就从官网来818这些东西 1.关于 ENUM 迁移的问题? 这里引用别人的一段话:但ENU ...

  4. mysql 5.7 enum_MySQL慎用 ENUM 字段

    前言:在网上看了很多文章,大家都是推荐 MySQL 要慎用 ENUM 字段,但是原理感觉还是有点模糊.今天我们就从官网来818这些东西 1.关于 ENUM 迁移的问题? 这里引用别人的一段话:但ENU ...

  5. from mysql partition select_爬虫(九十九)mysql详解二

    **mysql中字段的常见类型: ** 二进制位 bit(长度) tinyint[(长度)] [有无符号unsigned] [位数低于长度时候是否填充零zerofill] 有符号表示范围-128 ~ ...

  6. mysql映射超_Hibernate的映射类型 hibernate mysql映射类型

    (转)http://blog.csdn.net/zxy_snow/article/details/7214222 Hibernate的映射类型 hibernate mysql映射类型 1.Hibern ...

  7. MySQL学习笔记之九:MySQL Replication

    Mysql内建的复制功能是构建大型.高性能应用程序的基础.复制功能不仅有利于构建高性能的应用,同时也是高可用性.可扩展性.灾难恢复.备份以及数据仓库等工作的基础. 一.复制概述 1.复制的功用 数据分 ...

  8. Mysql数据库(九)——mysql高阶语句(下)

    Mysql数据库(九)--mysql高阶语句(下) 一.函数 1.数学函数 2.聚合函数 3.字符串函数 4.日期时间函数 二.存储过程 1.简介 2.优点 3.语法 ①.例 ②.参数分类 ③.带参数 ...

  9. ORACLE和MYSQL的九大区别

    ORACLE和MYSQL的九大区别 1.组函数用法规则 mysql中组函数在select语句中可以随意使用,但在oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的,或者是group ...

最新文章

  1. Analysis and Design Overview
  2. linux下eclipse的使用教程,linux下Eclipse的使用方法总结.doc
  3. Redis+Nginx+设计模式+Spring全家桶+Dubbo+阿里P7技术精选文档
  4. 白话异常检测算法Isolation Forest
  5. 【实操】路由选择工具ACL
  6. 开源 | 如何实现一个iOS AOP框架?
  7. 如何用CSS让一个容器水平垂直居中?
  8. IIS7下 【请求被中止: 未能创建 SSL/TLS 安全通道 】 解决方法
  9. 110亿美金EOS都能瞬间归零,区块链谈何安全保障?
  10. 简单的Flash网络游戏源代码
  11. 计算机水平拼音怎么写,电脑上的拼音到底是怎么敲出来的
  12. 关于SVN状态图标不显示的解决办法
  13. Air202学习(4)官方例程(luat版)
  14. linux 截屏_如何在Linux上截图
  15. mysql 1236错误_mysql报1236错误代码该如何解决
  16. the-craft-of-selfteaching之《自学是门手艺》开源项目书的学习笔记一篇
  17. java 遍历数据的三种方式
  18. 吞噬星空鸿蒙殿主,论《吞噬星空》是鸿蒙三部曲的最后一部!
  19. PX4装机教程(八)常用硬件
  20. 【金猿产品展】亿信华辰睿治——VIP策略,打造数据治理最佳实践

热门文章

  1. Unity3D调用摄像头显示当前拍摄画面
  2. 【java】【乱码】Java 读取本地 UTF8 txt文件乱码处理
  3. 深入理解JavaScript中的this关键字
  4. Linux常用备份恢复工具
  5. fatal: Could not read from remote repository.的解决办法
  6. 休眠后gpio状态_STM32中GPIO的8种工作模式总结
  7. aio nio aio_AIO的完整形式是什么?
  8. java线程和操作系统线程_操作系统中的线程
  9. java treemap_Java TreeMap HigherKey()方法与示例
  10. mysql gtid配置_mysql 5.7 GTID主从配置