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

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 拾遗:系列文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java @valid 密码不一致_一个成熟的Java项目如何优雅地处理异常

(一)概述异常处理是一个系统最重要的环节,当一个项目变得很大的时候,异常处理和日志系统能让你快速定位到问题。对于用户或者接口调用者而言,优雅的异常处理可以让调用者快速知道问题所在。本文将介绍如何优雅地处理异常。(二)使用通用的返回…

spark消费kafka产生数据堆积怎么处理_SparkStreaming读取Kafka的两种方式

本文主要从以下几个方面介绍SparkStreaming读取Kafka的两种方式:一、SparkStreaming简介二、Kafka简介三、Redis简介(可用于保存历史数据或偏移量数据)四、SparkStreaming读取Kafka数据的两种方式 五、演示Demo一、SparkStreaming简介可以参考这篇文章:SparkStreami…

MySQL数据步骤管控_数据管理的发展过程分为哪三个阶段

数据管理的发展过程分为哪三个阶段发布时间:2020-11-12 12:01:00来源:亿速云阅读:124作者:小新这篇文章主要介绍数据管理的发展过程分为哪三个阶段,文中介绍的非常详细,具有一定的参考价值,感兴…

myftpadmin+proftpd+mysql架设ftp服务器_linux下用Proftpd搭建ftp服务器及配置方法

首先proftpd是一个开源软件,其官方地址是http://www.proftpd.org,目前最高版本是:1.3.1(非稳定版),稳定的版本是1.3.0,下载文件为proftpd-1.3.0a.tar.gz我下载的是1.3.0,上传到服务器上后按照常规的方法安装…

mysql设置输出格式_rsyslog 配置mysql输出格式

http://www.rsyslog.com/doc/v8-stable/configuration/modules/ommysql.html文档中:Note rsyslog contains a canned default template to write to the MySQL database. It works on the MonitorWare schema. This template is:$template tpl,”insert into System…

nginx trac mysql svn_apache+mysql+trac+svn

Windows 2008 R2安装ApacheSVNTracMySQL步骤及心得一、软件准备1.Apache_2.2.14-win32-x86-no_ssl.msi2.Setup-Subversion-1.7.1.exe3.TortoiseSVN-1.6.16.215114.Mysql-5.5.28-win32.exehttp://www.doczj.com/doc/3bbc3a4b915f804d2b16c1e7.html Framework V4.06.Python-2.7.6…

python 所有关键字解释_Python关键字详细解释

Python关键字,也被称为保留字。保留字是官方定义的,具有特殊含义的单词。 用户不能使用保留字作为变量、函数、类等自定义的名称。查看当前Python版本保留字的方法。打开cmd,执行python,进入到Python交互模式中然后依次输入下面的…

python字符串操作作业_python 第二天作业

#python 中的循环#先介绍for循环#格式#for 临时变量 in 可迭代对象# 循环体#name neusoft#for a in name :# print(a)# if a s# print(嘿嘿)#循环次数哪里去了?# #这个a是什么鬼? a是临时变量 提前声明 python自动为你创建#range (起始位置&#xff0c…

python字符串迭代_Python字符串迭代/函数

我需要我的“items”变量将每个项目打印到新行上。我总是在“items”中得到总数,在“total”中得到总数。“总计”打印出我想要的结果,但我希望这些项目单独打印。在有什么想法?在def adding_report():user_input input("Report Types …

python 白化_Python新疆某气候要素IDW(反距离权重)插值

1、Rbf插值import numpy as npimport cartopy.crs as ccrsimport cartopy.feature as cfeatfrom cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTERfrom cartopy.io.shapereader import Readerimport matplotlib.pyplot as pltimport matplotlib.ticker a…

帆软报表参数传给网络报表_报表开发工具FineReport的使用: 程序网络报表

1定义程序网络报表程序网络报表所在类需要继承com.fr.web.reportlet这个抽象类,并且需要实现createReport(ReportletRequest arg0)这个方法,并返回报表对象。具体代码如下:2//程序网络报表package com.fr.demo; import java.util.Map;impo…

bootstrap 取消_学习写个网站(5)Bootstrap学习2

吃了2天烧烤夜宵&#xff0c;还是得讲点自律。【正文】继续bootstrap&#xff0c;还是菜鸟教程。11. 分页就是还有种就是翻页&#xff0c;12. 标签class"label label-default">默认标签</span>label-primarylabel-success13. 警告就是那种可以取消的消息&am…

jdbc mysql user_tab_comments_MySQL学习(五)——使用JDBC完成用户表CRUD的操作

通过案例我们发现“获得连接”和“释放资源”两次代码将在之后的增删改查所有功能中都存在&#xff0c;开发中遇到此种情况&#xff0c;将采用工具类的方法进行抽取&#xff0c;从而达到代码的重复利用。1、使用properties配置文件开发中获得连接的4个参数(驱动、URL、用户名、…

mysql系统属性_mysql 显示表字段及mysql系统信息

SHOW DATABASES //列出 MySQL Server 数据库。SHOW TABLES [FROM db_name] //列出数据库数据表。SHOW TABLE STATUS [FROM db_name] //列出数据表及表状态信息。SHOW COLUMNS FROM tbl_name [FROM db_name] …

mysql中try的意思_java中try是什么意思

try是Java中的关键字&#xff0c;主要用于异常处理机制&#xff0c;那么它有什么作用呢&#xff1f;try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内&#xff0c;当try语句块内发生异常时&#xff0c;异常就被抛出。它一般与catch..finally组合使用块…

如何在命令中授权给MySQL_MySQL如何使用授权命令grant

本文实例&#xff0c;运行于 MySQL 5.0 及以上版本。MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant 权限 on 数据库对象 to 用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user%…

linux用java连接mysql_Java使用JDBC方式连接数据库

开发一个JDBC应用程序&#xff0c;基本需要以下几个步骤&#xff1a;1.把JDBC驱动类装载入Java虚拟机中。使用java.lang.Class类的静态方法forName(String className)实现。例&#xff1a; Class.forName("JDBC驱动类名称")2.加载驱动&#xff0c;并与数据库建立连接…

mysql 字段钳口可加引号_根据处理对象划分,计算机可以分为模拟计算机、(

【判断题】( )3.保证数控机床各运动部件间的良好润滑就能提高机床寿命。【单选题】在储位编码中,把一些相关性货品经过集合以后,区分成几个品项群,再对其进行编码的方法是( )。【填空题】在数据库技术中,DBMS是 ,DB是指() 、DBS是指数据库系统。【单选题】25. 为保证下刀的安全…

mysql存储过程游标移动_mysql动态游标与mysql存储过程游标(示例)

-- 建立测试表和数据create table webuser (username varchar(10));insert into webuser values (a1),(a2),(a3),(b1),(b2),(b3);commit;-- 建立存储过程drop procedure if exists dynamic_cursor;delimiter // www.jbxue.comCREATE PROCEDURE dynamic_cursor (IN p_name varch…

python ftplib bufsize_python:ftplib模块

from ftplib import FTP #加载ftp模块ftpFTP() #设置变量ftp.set_debuglevel(2) #打开调试级别2&#xff0c;显示详细信息ftp.set_pasv(0) #0主动模式 1 #被动模式ftp.connect("IP","port") #连接的ftp s…