概述
是否曾经发现自己构建数据库只是为了开始质疑应该为特定列使用哪些数据类型?在MySQL 数据类型系列的这个条目中,我们将探索将字符串和文本保存到数据库的各种方法,以帮助揭开开发人员的神秘面纱,从VARCHAR和开始CHAR。
VARCHAR 与 CHAR
VARCHAR可能是最广泛使用的字符串数据类型。它存储一个可变长度的字符串,最多可达 65,535 个字符。创建VARCHAR字段时,您将能够使用VARCHAR(n)格式指定该字段将接受的最大字符数,其中n是要存储的最大字符数。由于 is 是可变长度的,它只会分配足够的磁盘空间来存储字符串的内容,而不是传入的内容的全长。
VARCHAR还为存储的每个值分配一点额外空间。根据存储数据所需的空间,将分配 1 或 2 个字节的开销。如果所需空间小于 255 字节,将添加 1 字节前缀,否则将使用 2 字节前缀。存储值所需的确切空间取决于所使用的字符集(稍后会详细介绍)。
CHAR是另一种存储字符串的方法,但它的最大长度为 255 并且是固定长度。与 一样VARCHAR,您可以选择使用格式设置CHAR字段中的最大字符数。CHAR(n)如果未指定,则n默认为 1。存储在CHAR列中的值右填充空格,因此n无论保存的字符串如何,它都会始终存储字符。在某些情况下,这实际上可以提高数据库的性能。
考虑charset
虽然大多数编程语言使用来自英语的字符,但世界各地的人类使用不同类型的字符进行书写和阅读。这可以像西班牙语一样简单,也可以像日语Ñ一样非常不同。データベース为了解决这个问题,MySQL 有不同的字符集(或字符集)来处理不同语言中使用的符号。字符集会影响文本在数据库中的存储方式,但也会影响保存数据时分配的存储空间量。
例如,当使用默认字符集时utf8mb4,MySQL 将为每个存储的字符分配 4 个字节。VARCHAR考虑到这一点,再加上所有列的最大行大小为 65,535 字节,由于每个字符的存储要求,您实际上只能创建最大长度为 16,383 个字符的列。
可视化差异
将数据保存到CHAR字段时,一个副作用是字符串中的任何尾随空格在保存值时实际上会丢失。事实上,当您从CHAR列中查询数据时,MySQL 甚至不会返回尾随空格,因为它必须假设额外的空格只是填充。
为了演示这一点,让我们创建一个包含两列的表,一VARCHAR(20)和一CHAR(20)。然后我们将在其末尾插入一些带有五个空格的数据,以查看它是如何存储的。
CREATE TABLE strings(
id INT PRIMARY KEY AUTO_INCREMENT,
variable VARCHAR(20),
fixed CHAR(20)
);
INSERT INTO strings (variable, fixed) VALUES ("Drifter ", "Drifter ");
现在,如果我运行以下SELECT语句,返回的数据似乎是相同的。
SELECT * FROM strings;
但是,如果我使用该函数计算每个字段中使用的字符CHAR_LENGTH数,您会注意到存储在VARCHAR字段中的数据(用显示 7。这是因为 MySQL 将空格存储在值的末尾,但它假定值末尾的额外空间是根据数据类型附加的填充。
SELECT CHAR_LENGTH(variable) AS varchar_data_length, CHAR_LENGTH(fixed) AS char_data_length FROM strings;
如前所述,VARCHAR当数据写入磁盘时,值也会产生额外的开销。这意味着如果您存储长度为 6 个字符的字符串“Spider”,并且将其存储在 aVARCHAR(6)和 aCHAR(6)列中,则该VARCHAR值将使用 25 个字节(使用utf8mb4字符集的每个字符 4 个字节加上 1 个字节开销)的磁盘空间,而该CHAR值将使用 24 个字节。
但是,如果您将“Eido”存储在这些相同的列中,VARCHAR则将仅使用 5 个字节,并且CHAR仍将使用 6 个字节。由于CHAR数据类型是定长的,所以右补2个空格,一共6个。
何时使用VARCHARvs CHAR
现在您已了解 和 之间的区别VARCHAR,CHAR这里有一些关于确定哪种数据类型最适合您的应用程序的提示:
在以下情况下使用VARCHAR:
- 您需要存储超过 255 个字符的字符串。
- 您会发现自己处于需要保留尾随空格的罕见情况。
在以下情况下使用CHAR:
- 您的字符数等于或低于 255 个字符,并且您始终知道字符串的长度。
- 固定长度的序列号将是一个很好的例子,说明何时CHAR有用。
原文标题:MySQL data types: VARCHAR and CHAR
原文作者:Brian Morrison II
原文地址:https://planetscale.com/blog/mysql-data-types-varchar-and-char