关联博文:

MySQL中数值类型(列类型)与显示宽度

MySQL中的列类型之字符串类型总结

在SQL中,将字符串类型分为了六类:char,varchar,text,blob,enum和set。

类型 长度
char 0-255字符
VARCHAR(M) M为0~65535之间的整数,UTF8下最多设置21845字符
TINYBLOB 允许长度0~255字节
BLOB 允许长度0~65535字节
MEDIUMBLOB 允许长度0~167772150字节
LONGBLOB 允许长度0~4294967295字节
TINYTEXT 允许长度0~255字节
TEXT 允许长度0~65535字节
MEDIUMTEXT 允许长度0~167772150字节
LONGTEXT 允许长度0~4294967295字节
VARBINARY(M) 允许长度0~M个字节的变长字节字符串
BINARY(M) 允许长度0~M个字节的定长字节字符串

【1】定长字符串char

磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度。

Char(M):M代表length,可以存储的长度,单位为字符,最大长度值可以为255。

char(4):在UTF8环境下,需要43=12个字节存储空间;GBK编码环境下需要42=8个字节存储空间(在java中使用两个字节来表示一个字符)。

Java基本类型占用的字节数:
1字节: byte , boolean
2字节: short , char
4字节: int , float
8字节: long , double
注:1字节(byte)=8位(bits)


【2】变长字符串varchar

变长字符串在分配空间的时候按照最大长度的空间分配,实际用了多少根据具体的数据来定。

Varchar(M) : M表示字符长度,理论可以存储65536个字节。会多出1-2个字节来确定存储的实际长度。UTF-8下varchar(M)中M最大为21845。GBK下M最大为32767。

不要忘记了,varchar需要留有字节储存长度;如果是21845,那么对应字节为:21845*3+2=65537>65535! **所以 UTF8下,varchar实际最大长度为21844 , GBK:32766(实际值不是32767哦)

Varchar(10):储存10个汉字,UTF8下使用10*3+1=31个字节

在生产环境中如何选择定长或者变长字符串类型呢?

定长的磁盘空间比较浪费,但是效率高:如果数据长度基本一样,就选择定长;如身份证,手机号码等。

变长的磁盘空间比较节省,但是效率低:如果数据不能确定长度(不同数据长度有变化),如姓名,地址等。

MySQL记录中,如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储null。如果想释放该字节,那么所有字段设置 not null(无论有多少个字段允许为空,只会保留一个字节去存储null)。


【3】文本字符串

如果数据量超过255个字符,通常会使用文本字符串。

文本字符串根据存储的数据格式进行分类:

  • Text:存储文字;
  • Blob:存储二进制数据,如图片、音频等。

通常二进制数据实际上数据库存储路径,物理文件放在磁盘上面。

对于经常变更的数据来说,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上更有效率。

使用时要注意只分配需要的空间,更长的列排序时会消耗更多内存。尽量避免使用TEXT/BLOB类型,查询时会使用临时表,导致严重的性能开销。

MySQL中text文本字符串不占用记录长度,额外存储(正确理解应是文本字符串的数据内容额外存储,不占用记录长度)。但是text文本字符串也是记录的一部分,那么一定需要占用记录的部分长度–10个字节(保存数据的地址与长度)!


【4】枚举

枚举:enum,事先将所有出现的结果都设计好,实际存储的数据必须是预先规定的数据的一个。

  • ① 规范数据格式,数据只能是规定的数据中的其中一个;

  • ② 节省存储空间,枚举通常有一个别名-单选框;枚举实际存储的是数值而不是字符串本身。

  • ③ 如果列表成员为1~255,则需要1个字节存储;如果列表成员为255~65535,则需要2个字节存储;最多65535个成员!

create table my_enum(
gender enum('男','女','保密')
)charset utf8;desc my_enum;

测试如下:

insert into my_enum VALUES('男');--有效数据
insert into my_enum VALUES('人妖');--无效数据


Tips:

在MySQL中,系统也是自动转换数据格式的,尤其是字符串转数字。如字符串若非数字,将转换为0;若以数字开头则转换为对应的开头数字。

select 1+'hello',1+'1hello',1+'2hello','1.0hello',1+'1.1hello',1+'1.1.1hello',1+'1.2.1hello';


查看一下刚才插入的数据在MySQL是如何存储的:

select gender, gender+0 from my_enum


枚举原理

枚举在进行数据规范的时候(定义的时候),系统会自动建立一个数字与枚举元素的对应关系(关系放到日志中)。

在进行数据插入的时候,系统自动将字符转换成对应的数字进行存储;然后在进行数据提取的时候,系统将其转换为字符进行显示。

枚举插入数字:

insert into my_enum VALUES('1'),('2'),('3');--会插入'关系'中对应的字符串,存储的是字符串对应的数字;
select gender, gender+0 from my_enum


【5】Set集合字符串

集合跟枚举很相似,实际存的是数字而不是字符串本身(集合是多选),区别与枚举,别名可以称为复选框!!!

Set(元素列表),可以使用元素列表中的多个元素,元素之间可以使用逗号分隔。

说明:1,2,3,4,8 ;分别对应tinyint,smallint,mediumint,int,bigint。在底层存储的时候,使用整型存储的(存储字符对应的数字,而不是字符本身,参考enum)。

如有8个元素,那么使用1个子节存储(tinyint);16个元素使用两个字节存储(smallint);33个元素使用8个字节存储(bigint)。远比varchar或者char占用磁盘空间少得多。

如果是varchar,8个元素,那么需要24+1=25个字节;但是set只需要1个字节。


create table my_set(
hobby SET('篮球','足球','乒乓球','羽毛球','排球','台球','网球','棒球')
)charset utf8;DESCRIBE my_set

insert into my_set VALUES('足球,篮球');--插入的时候不用考虑顺序,服务器存储的时候会自动寻找对应位置,看下面分析。。insert into my_set VALUES('足球');insert into my_set VALUES('足球篮球');--无效数据,未用逗号分隔insert into my_set VALUES('小球,篮球');--不存在的数据insert into my_set VALUES(4);--直接插入数字.....
select hobby,hobby+0 from my_set ORDER BY hobby ASC;


是不是存的数字出乎意料?不再是1,2,3。。。

分析如下图:

那么插入数字255时(因为八个位全为1),对应全部字符串:

insert into my_set VALUES(255);select hobby,hobby+0 from my_set ORDER BY hobby ASC;

set如此节省磁盘空间,但是生产中并未常使用!因为效率优先。所以enum和set使用频率并不如varchar高!!!

和Enum类型类似,里面可以保存0~64个成员。和Enum类型最大的区别是:SET类型一次可以选取多个成员,而Enum只能选一个。根据成员个数不同,存储所占的字节也不同。

成员数 字节数
1~81 1
9~162 2
17~243 3
25~324 4
33~648 8

MySQL中的列类型之字符串类型总结相关推荐

  1. 面试官问:mysql中时间日期类型和字符串类型的选择

    摘要:MySQL中有多种表示时间日期的数据类型,主要有YEAR.TIME.DATE.DATETIME.TIMESTAMP等 本文分享自华为云社区<一针见血,mysql中时间日期类型和字符串类型的 ...

  2. Hive表中修改列位置,更改类型、移动位置(impala支不支持更改位置)

    Hive表中修改列位置,更改类型.移动位置 Hive 目标:在hive中实现在指定位置添加列 背景:hive中添加新列时会默认在最后一列依次添加,无法同mysql一样可以指定位置. 解决方法:首先在h ...

  3. MySQL 基础 -- MySQL 数据类型说明(数值类型、字符串类型、日期时间类型)、SQL通用语法和SQL分类

    文章目录 1. 数据类型说明(数值类型.字符串类型.日期时间类型) 1.1数值类型 1.2 字符串类型 1.3 日期类型 1.4 数据类型练习:设计一张员工信息表 2. SQL通用语法和SQL分类 2 ...

  4. Mysql中的varchar类型转换成int类型

    Mysql中的varchar类型转换成int类型 1.实战案例 1.1 student表结构 mysql> desc student; +----------+-------------+--- ...

  5. 列表中的字符串成员 转化为 整型成员 。如:将[‘2‘, ‘1‘] 转化为:[2, 1]、map()返回的是一个可迭代对象内存地址、join(可迭代对象),要注意:可迭代对象中的成员必须是字符串类型

    注意: 1.map()返回的是一个可迭代对象的内存地址,如果要看它具体的值,有两种方式: 法1:在map()前面,加list( ).tuple( ).set( ),将它强制转化为列表.元组.集合类型. ...

  6. Python数字类型及字符串类型的内置方法 ##

    数字类型及字符串类型的内置方法 数字类型 数字类型有哪些? 整型和浮点型 有哪些运算符? 平时用的加减乘除.整除.模运算.幂运算,比较运算等 他们的属性? 数字类型没有有序,无序一说.换言之,不存在索 ...

  7. 注册表处理之(写入DWORD类型或者字符串类型的键项值)

    写入DWORD类型或者字符串类型的键项值 HKEY hKey; DWORD dw; RegOpenKeyEx(hMainKey,subKey,0,0,&hKey);//打开子键 if(1 == ...

  8. python的四种内置数字类型_浅析Python数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

  9. MySQL中concat函数(连接字符串)

    MySQL中concat函数(连接字符串) MySQL中concat函数 使用方法: concat(str1,str2,-) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 ...

最新文章

  1. linux id命令用来查看账户的uid和gid及所属分组及用户名
  2. 辅助域控如何抢占角色(主域控已经down机不可恢复了)
  3. 【c_prime_plus】第十七章笔记
  4. 557. 反转字符串中的单词 III
  5. html ascii编码方式,HTML 字符集 参考手册
  6. 机器学习03Logistic回归
  7. 穷人为什么会越穷,穷的时候以下三个事情不能干
  8. SpringCloud工作笔记068---登录堡垒机_下载文件报错_Xshell向Linux上传下载文件_lrzsz_ZModem
  9. java duration 时间差_java8 计算时间差的方法示例
  10. android播放器录制视频,Android播放器的录制实践
  11. WiFi大师4.0.5源码最新独立版本
  12. Android九环刀之RatingBar之评委请亮分
  13. 2414905-34-1,Thalidomide-O-PEG5-Tosyl它与亲核物质如胺、含羟基的分子反应
  14. 搜索的实例——水管工游戏
  15. *皮亚诺关于公理4的一段语录解析 皮亚诺读后之六
  16. 什么是RPN,ROIAlign?
  17. SpringBoot 如何异步编程,老鸟们都这么玩的
  18. cisco 华三 对接_h3c与cisco对接注意
  19. 机器学习实战——特征工程之关联规则
  20. 51单片机点亮流水灯

热门文章

  1. Python pprint | 超级好用的Python库,漂亮的打印,让json数据提取体验更好
  2. 十部气势恢宏的经典战争片
  3. ORA-12505错误的解决方法
  4. 游戏建模:学习3Dmax心路历程感悟以及总结,不建议使用汉化版
  5. 计算机怎么配置组播地址,如何实现端口静态添加组播MAC地址 -电脑资料
  6. 怎么看燃气表中还剩多少气_怎么看天然气表还剩多少气
  7. ThinkSNS电商版,电子商务社交的的福音
  8. 知识星球 英雄算法联盟,五月集训,打卡第二天(1)
  9. 【JAVA上传图片到服务器实现远程访问---3种方法】
  10. Windows本地快速搭建SFTP服务共享文件【外网访问】