Mysql VARCHAR列是如何实现的?它们是实际的字符数组吗?
如果我在一个表上创建一个Mysql VARCHAR列是如何实现的?它们是实际的字符数组吗?,mysql,sql,optimization,memory-management,database-design,Mysql,Sql,Optimization,Memory Management,Database Design,如果我在一个表上创建一个VARCHAR(50)类型的列并添加行,那么这些行实际上是否有50个字符(如果有空终止字符,则为51个)?换句话说,如果我部署我的应用程序,进入该列的用户输入结果仅为不超过10个字符的字符串,我是否浪费了80%的内存?回答您问题的最佳方法是通过比较 CHAR和VARCHAR类型相似,但在存储和检索方式上有所不同。从MySQL 5.0.3开始,它们在最大长度和是否保留尾随空格方面也有所不同 例如: DECLARE CHARARRAY CHAR(30) = 'TEST' --
VARCHAR(50)
类型的列并添加行,那么这些行实际上是否有50个字符(如果有空终止字符,则为51个)?换句话说,如果我部署我的应用程序,进入该列的用户输入结果仅为不超过10个字符的字符串,我是否浪费了80%的内存?回答您问题的最佳方法是通过比较
CHAR和VARCHAR类型相似,但在存储和检索方式上有所不同。从MySQL 5.0.3开始,它们在最大长度和是否保留尾随空格方面也有所不同
例如:
DECLARE CHARARRAY CHAR(30) = 'TEST' -- RESULT IS 'TEST..<30 - 4 SPACES>' (WITH TRAILING SPACES)
CHAR和VARCHAR类型的声明长度表示要存储的最大字符数。例如,CHAR(30)最多可以容纳30个字符
CHAR列的长度固定为创建表时声明的长度。长度可以是0到255之间的任意值。存储CHAR值时,会使用空格右键填充到指定的长度。检索字符值时,将删除尾随空格
VARCHAR列中的值是可变长度字符串。在MySQL 5.0.3之前,长度可以指定为0到255之间的值,在5.0.3及更高版本中,长度可以指定为0到65535之间的值。MySQL 5.0.3及更高版本中VARCHAR的有效最大长度取决于最大行大小(65535字节,在所有列中共享)和使用的字符集
与CHAR不同,VARCHAR值存储为1字节或2字节长度前缀加数据。长度前缀表示值中的字节数。如果值不需要超过255字节,则列使用一个长度字节;如果值可能需要超过255字节,则使用两个长度字节
结论
如果您想优化数据库,我建议您使用varchar
而不是char。字段的大小可能因字段使用情况而异。如果您开始拥有一个design yourself数据库,可能会对您有所帮助
参考:
回答问题的最佳方式是通过比较 CHAR和VARCHAR类型相似,但在存储和检索方式上有所不同。从MySQL 5.0.3开始,它们在最大长度和是否保留尾随空格方面也有所不同 例如:
DECLARE CHARARRAY CHAR(30) = 'TEST' -- RESULT IS 'TEST..<30 - 4 SPACES>' (WITH TRAILING SPACES)
CHAR和VARCHAR类型的声明长度表示要存储的最大字符数。例如,CHAR(30)最多可以容纳30个字符
CHAR列的长度固定为创建表时声明的长度。长度可以是0到255之间的任意值。存储CHAR值时,会使用空格右键填充到指定的长度。检索字符值时,将删除尾随空格
VARCHAR列中的值是可变长度字符串。在MySQL 5.0.3之前,长度可以指定为0到255之间的值,在5.0.3及更高版本中,长度可以指定为0到65535之间的值。MySQL 5.0.3及更高版本中VARCHAR的有效最大长度取决于最大行大小(65535字节,在所有列中共享)和使用的字符集
与CHAR不同,VARCHAR值存储为1字节或2字节长度前缀加数据。长度前缀表示值中的字节数。如果值不需要超过255字节,则列使用一个长度字节;如果值可能需要超过255字节,则使用两个长度字节
结论
如果您想优化数据库,我建议您使用varchar
而不是char。字段的大小可能因字段使用情况而异。如果您开始拥有一个design yourself数据库,可能会对您有所帮助
参考:
字符集 除了其他人所说的之外,该列的
字符集
还需要考虑因素
ascii
使用1字节表示1个字符。latin1
使用1字节表示1个字符。utf8
使用1、2或3个字节表示一个字符。utf8mb4
对一个字符使用1、2、3或4个字节
声明上的数字是字符,而不是字节
CHAR(10)
可以容纳给定字符集中最宽的10个字符。对于utf8mb4,它将始终占用40个字节。这是一个理由
- 切勿使用
CHAR
,始终使用VARCHAR
,和/或
- 对于Y/N、M/F、国家代码、邮政编码、SSN、十六进制字符串等,明确地说
字符集ascii
VARCHAR(10)字符集utf8mb4
最多可处理10个字符,无论是1字节英文字符还是3字节和4字节中文字符
选择中的临时表
执行某些操作的SELECT
,如groupby
或ORDER BY
或“UNION”,可能决定需要为中间处理构建一个“temp”表。如果是这样,它首先考虑使用内存引擎在RAM中构建表。如果是这样,那么它将所有VARCHARs
转换为CHARs
进行处理。常见的是看到last\u name VARCHAR(255)字符集utf8
。但当使用这些临时表中的一个时,每行变为765字节。这不是很有效。您多久见过255个字符长的姓氏?所以
- 不要总是使用
(255)
;使之合理化;及
- 适当时使用ascii/latin1
字符集
除了其他人所说的之外,该列的字符集
还需要考虑因素
ascii
使用1字节表示1个字符。
latin1
使用1字节表示1个字符。
utf8
使用1、2或3个字节表示一个字符。
<代码