mysqltext与varchar区别(MySQL CHAR和VARCHAR该如何选择)
mysqltext与varchar区别
MySQL CHAR和VARCHAR该如何选择 VARCHAR 和 CHAR 类型VARCHAR 和 CHAR 是两种主要的字符串类型,用于存储字符。不幸的是,由于实现的方式依赖于存储引擎,因此很难解释这些字符串在磁盘和内存中如何存储,除了除了常用的 InnoDB 和 MyISAM 外,假设你使用了其他存储引擎,应当仔细阅读存储引擎的文档。
VARCHAR 存储可变长度的字符串,也是最常用的字符数据类型。相比固定长度的类型,VARCHAR 所需的存储空间更小,它会尽可能少地使用存储空间(例如,短的字符串占据的空间)。对于 MyISAM 来说,如果创建表的时候指定了 ROW_FORMAT=FIXED 的话,那么会使用固定的空间存储字段而导致空间浪费。VARCHAR 使用1-2个额外的字节存储字符串的长度:当最大长度低于255字节的时候使用1个字节,如果更多的话就使用2个字节。因此,拉丁字符集的 VARCHAR(10)会使用11个字节的存储空间,而 VARCHAR(1000)则会使用1002个字节的存储空间。
VARCHAR 由于能够节省空间,因此可以改善性能。但是,由于长度可变,当更新数据表的时候数据行的存储空间会变化,这一定程度上会带来额外的开销。如果数据行的长度导致原有的存储位置无法存放,那么不同的存储引擎会做不同的处理。例如 MyISAM 可能产生数据行的碎片,而 InnoDB 需要进行磁盘分页来存放更新后的数据行。
通常,如果最大的列长度远远高于平均长度的话(例如可选的备注字段),使用 VARCHAR 是划算的,同时如果更新的频次很低,那么碎片化也不会是一个问题。需要注意的是,如果使用的是 UTF-8字符集,则实际存储的字节长度是根据字符定的。对于中文,推荐的存储字符集是 utf8mb4。
CHAR 类型的长度是固定的,MySQL 会对每个字段分配足够的存储空间。存储CHAR 类型值的时候,MySQL 会移除后面多出来的空字符。值是使用空字符进行对齐以便进行比较。对于短的字符串来说,使用 CHAR 更有优势,而如果所有的值的长度几乎一致的话,就可以使用 CHAR。例如存储用户密码的MD5值时使用 CHAR 就更合适,这是因为 MD5的长度总是固定的。同时,对于字段值经常改变的数据类型来说,CHAR 相比 VARCHAR 也更有优势,因为 CHAR 不会产生碎片。对于很短的数据列,使用 CHAR 比 VARCHAR更高效,例如使用CHAR(1)存储逻辑值的 Y 和 N,这种情况下只需要1个字节,而 VARCHAR 需要2个字节。 对于移除空字符这个特性会感觉奇怪,我们举个例子:
|
CREATE TABLE t_char_varchar_test ( id INT PRIMARY KEY , char_col CHAR (10), varchar_col VARCHAR (10) ); INSERT INTO t_char_varchar_test VALUES (1, 'string1' , 'string1' ), (2, ' string2' , ' string2' ), (3, 'string3 ' , 'string3 ' ); |
按上面的结果插入数据表后,string2中的前置空格不会移除,但使用 CHAR 类型存储时,string3尾随空格会被移除,使用 SQL 查询结果来检验一下:
|
SELECT CONCAT( "'" , char_col, "'" ), CONCAT( "'" , varchar_col, "'" ) FROM t_char_varchar_test WHERE 1 |
得出来的结果如下,可以看到 CHAR 类型的 string3后面的空格被移除了,而 VARCHAR类型的没有。这种情况大多数时候不会有什么问题,实际在应用中也经常会使用 trim 函数移除两端的空字符,但是如果确实需要存储空格的时候,那就需要注意不要选择使用 CHAR 类型:
数据如何存储是由存储引擎决定的,而且存储引擎处理固定长度和可变长度的数据的方式并不相同。Memory 引擎使用固定大小的行,因此它需要分配最大可能的存储空间——即便数据长度是可变的。但是,对于字符串的对齐和空字符截断是由 MySQL 服务端完成的,因此所有存储引擎都是一样的。
与 CHAR 和 VARCHAR 相似的是 BINARY和 VARBINARY,用于存储二进制字节字符,BINARY 的对齐使用字符0的字节值来对齐,并且再获取值的时候不会截断。如果需要使用字符的字节值而不是字符的话,使用 BINARY 会更高效,这是因为比较时,一方面不需要考虑大小写,另一方面是MySQL一次只比较一个字节。
结语:
在实际数据表设计中,大多数情况下会选择使用 VARCHAR,但 VARCHAR 需要额外的1-2个字节存储字符串长度。需要注意的是在应用中最好能够限定字段的最大长度,从而可以使得数据表尽可能使用短的 VARCHAR来提高效率。同时,对于固定长度、长度很短或长度变化很小的字符类型,推荐使用 CHAR 类存储,以提高存储效率。
以上就是MySQL CHAR和VARCHAR的选择的详细内容,更多关于MySQL CHAR和VARCHAR的资料请关注开心学习网其它相关文章!
原文链接:https://juejin.cn/post/6967874434665283591
- mysql数据库丢失怎么办(MySQL 数据丢失排查案例)
- 搭建php和mysql的运行环境(Windows环境开发PHP完整配置教程Apache+Mysql+PHP)
- mysql5.7.24rpm安装(MySQL系列-YUM及RPM包安装v5.7.34)
- mysqlupdate原理(MySQL UPDATE 语句的非标准实现代码)
- mysql 5.5.27 winx64安装配置方法图文教程(mysql 5.5.27 winx64安装配置方法图文教程)
- mysql索引基本知识(MySql索引使用策略分析)
- mysql主从模式与读写分离(磁盘写满导致MySQL复制失败的解决方案)
- php添加数据到mysql数据库(PHP通过代码连接XAMPP数据库及MySQL数据库方法)
- docker怎么连接mysql(docker如何安装mysql)
- mysql创建数据库教程(MySQL创建数据库并支持中文字符的操作方法)
- mysql命令输入行在哪(MySQL命令行操作时的编码问题详解)
- docker 增大mysql连接数(docker中修改mysql最大连接数及配置文件的实现)
- mysql必背知识点高级(MySQL 8.0 Online DDL快速加列的相关总结)
- mysql8.0.15安装详细教程(Mysql8.0.22解压版安装教程小白专用)
- mysql主从配置教程(MySQL大库搭建主从的一种思路分享)
- mysql5.7.20非安装版教程(MySQL5.5 部署的一个问题)
- 泰国安全吗(泰国安全吗2023)
- 菲律宾安全吗(菲律宾安全吗)
- 泰国旅游攻略(泰国旅游攻略必去景点)
- 数字藏品市场有多乱 周杰伦丢了 一只猴 ,损失超300万(数字藏品市场有多乱)
- 这里输入关键词(怎么输入关键词搜索)
- 得这个 难治病 的人太多了,300个人赶到杭州商量怎么办(得这个难治病的人太多了)
热门推荐
- SQL Server中raiserror
- sqlserver如何添加数据库(sqlserver建立新用户及关联数据库教程)
- 查看docker日志大小(docker logs-查看docker容器日志的实现)
- OpenLDAP docker使用教程(Docker搭建OpenLDAP+phpLDAPadmin统一用户认证的方法)
- 关于docker安全之Docker-TLS加密通讯问题(关于docker安全之Docker-TLS加密通讯问题)
- vue商城购物车数据(vue实现购物车全部功能的简单方法)
- python下载后依然打不开文件(解决python打不开文件文件不存在的问题)
- dedecms简短标题(dedecms文章列表实现序列号排序效果实现代码)
- python如何一行行读取文件(python 实现一次性在文件中写入多行的方法)
- python线程池如何实现同步(Python mutiprocessing多线程池pool操作示例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9