Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql VARCHAR列是如何实现的?它们是实际的字符数组吗?_Mysql_Sql_Optimization_Memory Management_Database Design - Fatal编程技术网

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个字节表示一个字符。
<代码