MySQL数据类型:字符串类型详解
在MySQL数据库中,字符串数据类型用于存储各种文本信息。这些数据类型主要包括CHAR
、VARCHAR
、TEXT
和BLOB
等。
CHAR与VARCHAR
CHAR
CHAR
类型用于存储固定长度的字符串。它的长度在创建表时就已确定,长度范围从1到255个字符。CHAR
类型的特点是读取速度快,因为每条记录占用相同的空间,数据库可以快速定位到具体位置。但是,CHAR
类型的缺点是可能会浪费存储空间,因为不管实际存储的数据长度如何,都会使用固定长度,不足部分以空格填充。
VARCHAR
VARCHAR
类型是MySQL中用得最频繁的字符串类型之一,用于存储可变长度的字符串。与CHAR
类型相比,VARCHAR
节省空间,因为它只占用必要的空间加上一个额外的字节来记录长度(如果列声明的长度超过255,则需要两个字节)。VARCHAR
的最大长度可以达到65,535个字符,但实际限制取决于行大小和字符集。VARCHAR
类型非常适合用来存储长度不一的字符串,比如用户输入的数据。
使用建议
- 当字段的最大长度难以预测或文本长度有较大变化时,使用
VARCHAR
。 - 在数据长度经常变动的应用中,
VARCHAR
可以减少空间浪费。 - 考虑到性能和存储效率的平衡,合理设置
VARCHAR
的最大长度,避免过大或过小。
VARCHAR最大长度的影响因素
行大小限制
MySQL中,单行的最大数据量是固定的。对于标准的表,这个限制通常是65,535字符,这包括了所有列的数据以及行内的其他元数据。如果表中包含多个大字段或多个VARCHAR
字段,这些字段的最大潜在长度总和可能会超过这个行大小限制。因此,虽然理论上单个VARCHAR
可以支持到65,535个字符,实际上可能会因为行大小限制而无法达到这个长度。
字符集编码
VARCHAR
的最大长度还受到字符集编码的影响。不同的字符集编码字符所需的字节数不同:
- 在使用单字节字符集(如
latin1
)时,每个字符占用1个字节。 - 在使用多字节字符集(如
utf8mb4
)时,每个字符可能占用2到4字节。这意味着如果VARCHAR
字段采用utf8mb4
编码,其最大字符数将受到实际字节数的限制,即使你设置长度为65,535,实际存储的字符数量可能只有16,383个字符(因为65,535字节除以4字节/字符)。
其他列的存储需求
表中其他列的数据类型和存储需求也会影响VARCHAR
字段的最大长度。例如,如果表中还包含其他大量的固定长度字段(如CHAR
或大的INT
字段),这些字段占用的空间也会从行大小限额中扣除,进而影响VARCHAR
字段能够分配的最大空间。
字节,字符和编码的关系
在计算机中,一个字符所占的字节大小取决于字符的编码方式。不同的编码系统对字符进行编码的方法不同,因此所需的存储空间也不同。以下是几种常见的字符编码方式和它们对应的字节大小:
-
ASCII编码:最初的ASCII码是用7位(一个字节的部分)来表示一个字符,因此,一个ASCII字符等于1个字节。后来,扩展的ASCII(例如ISO 8859)使用8位,即1个字节来表示一个字符。
-
UTF-8编码:这是一种变长的编码方式,可以使用1到4个字节来表示一个字符。对于标准的ASCII字符(如英文字母和数字),仍然只需要1个字节。但对于其他一些特殊字符(如拉丁文扩展、希腊文等),可能需要2个字节,而对于大多数常用汉字或其他复杂字符,通常需要3个字节。某些特殊的符号和很少用的字符集则可能使用4个字节。
-
UTF-16编码:这种编码通常使用2个或4个字节来表示一个字符。大部分常见的字符,包括所有的基本多语言平面的字符(如汉字),使用2个字节表示。而那些不常用的字符,如一些古文字符或特殊符号,会使用4个字节表示(通过代理对来编码)。
-
UTF-32编码:在UTF-32编码中,每个字符均使用4个字节表示。这种编码方式简单统一,但相对于其他编码方式占用更多的存储空间。
TEXT与BLOB
TEXT
TEXT
类型用于存储大量文本数据。TEXT
列不存储在数据库行内,而是作为大型对象存储在外部,只在行内保留一个指针。因此,TEXT
类型可以存储大量数据,直到65,535字节(TEXT
)、16,777,215字节(MEDIUMTEXT
)或4,294,967,295字节(LONGTEXT
)。使用TEXT
类型的时候需要注意,处理这类数据可能会消耗更多的CPU和内存资源。
BLOB
BLOB
(Binary Large Object)类型与TEXT
类型相似,但用于存储大型的二进制数据,如图片、音频和视频等。BLOB
同样存储在外部,并通过行内指针进行访问。根据存储需求的不同,BLOB
类型分为TINYBLOB
、BLOB
、MEDIUMBLOB
和LONGBLOB
。
选择合适的字符串类型
在选择适合的字符串类型时,考虑以下因素:
- 数据的最大可能长度:预估数据的最大长度,选择合理的数据类型以避免浪费空间或数据截断。
- 查询性能需求:固定长度的
CHAR
更适合频繁搜索的场景,因为它的读取速度通常更快。 - 数据的变动频率:如果数据内容变化频繁,选择
VARCHAR
可以减少对存储空间的浪费。 - 存储大文本或二进制数据:对于需要存储大量文本或二进制数据的应用,应选择
TEXT
或BLOB
类型。
QA
varchar(10) 和 varchar(20) 的区别?
因为varchar是可变字符串,所以实际存储是一样的,但是在没有从存储引擎拿到数据前,不知道给varchar分配多大的内存,所以会根据定于的长度先分配,所以varchar(20) 可能比varchar(10)占用更多的内存空间
既然VARCHAR长度可变,那我要不要定到最大? 就像使用VARCHAR(5)和VARCHAR(200)存储 '陈哈哈’的磁盘空间开销是一样的。那么使用更短的列有什么优势呢?
事实证明有很大的优势。更长的列会消耗更多的内存,因为MySQL通常会分配固定大小的内存块来保存内部值。当然,在没拿到存储引擎存储的数据之前,并不会知道我这一行拿出来的数据到底有多长,可能长度只有1,可能长度是500,那怎么办呢?那就只能先把最大空间分配好了,避免放不下的问题发生,这样实际上对于真实数据较短的varchar确实会造成空间的浪费。
举例:我向数据类型为:varchar(1000)的列插入了1024行数据,但是每个只存一个字符,那么这1024行真实数据量其实只有1K,但是我却需要约1M的内存去适应他。所以最好的策略是只分配真正需要的空间。
参考链接
- MySQL官方文档:https://dev.mysql.com/doc/refman/8.0/en/char.html