varchar(255)能存多少汉字
在探讨varchar(255)在MySQL中能够存储多少汉字时,我们首先需要明确几个关键点,特别是关于MySQL版本对varchar类型定义的影响以及UTF-8编码的特性。
MySQL版本与varchar定义
MySQL 4.0及以下版本:在这些早期版本中,varchar(N)的定义是基于字节的,其中N指的是该字段可以存储的最大字节数。当使用UTF-8编码存储汉字时,由于一个汉字通常需要3个字节(这里简化了情况,实际上UTF-8编码下,汉字占用的字节数可以是1到4字节不等,但最常见的是3字节),因此varchar(20)在这样的设置下只能存储最多6个汉字(20字节 ÷ 3字节/汉字 ≈ 6.67,向下取整为6)。
MySQL 5.0及以上版本:从MySQL 5.0版本开始,varchar(N)的定义转变为基于字符数,其中N指的是该字段可以存储的最大字符数。这一改变使得varchar(20)能够无差别地存储20个字符,不论这些字符是数字、字母还是UTF-8编码下的汉字(每个汉字通常占用3字节)。不过,需要注意的是,虽然字段定义是基于字符数,但实际存储时仍会受到行大小限制(通常是65,535字节)和字符集编码方式的影响。
varchar(255)与汉字存储
在MySQL 8.0(继承了MySQL 5.0及以上版本的特性)中,varchar(255)意味着该字段可以存储最多255个字符。当使用UTF-8编码存储汉字时,理论上可以存储最多255个汉字(假设每个汉字都占用3字节,且忽略其他可能影响存储的因素,如字符集的具体实现差异)。然而,实际存储的字节数会根据具体汉字的UTF-8编码长度而变化,某些汉字可能占用更多字节。
UTF-8编码方式
编码方式 | 占用字节 | 说明 | 备注 |
UTF-8 | 每个字符最多占3个字节 | 汉字占3个字节 | |
UTF-8mb4 | Mysql 中保存 4 字节长度的 UTF-8 字符 | 5.5.3 版本以后的才支持; utf8mb4 是 utf8 的超集,支持表情emoj; | MySQL 8.0 默认的是 utf8mb4_0900_ai_ci 0900 指的是 Unicode 校对算法版本; ai 指的是口音不敏感。也就是说,排序时 e,è,é,ê 和 ë 之间没有区别; ci 表示不区分大小写。也就是说,排序时 p 和 P 之间没有区别 |
UTF-8mb4排序字符集
排序编码方式 | 说明 | 备注 |
utf8mb4_unicode_ci | 基于标准的 Unicode 来排序和比较,能够在各种语言之间精确排序 | utf8mb4_0900_ai_ci,属于 utf8mb4_unicode_ci 中的一种 |
utf8mb4_general_ci | 没有实现 Unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致 | utf8mb4_general_ci 在比较和排序的时候更快 |
varchar存储占用内存
varchar类型在数据库中用于存储可变长度的字符串。其存储方式会包括两部分:一部分用于存储字符串的长度信息,另一部分则用于存储实际的字符串数据。
长度信息的存储:varchar类型使用一个或两个字节来存储字符串的长度信息。具体来说,如果字符串的长度小于或等于255个字符,那么长度信息将占用1个字节;如果字符串的长度超过255个字符,那么将需要2个字节来存储长度信息。
数据本身的存储:对于字符串数据本身,其占用的字节数取决于所使用的字符编码。以UTF-8编码为例,每个字符可能占用1到3个字节不等(取决于字符的Unicode码点)。因此,对于存储了特定数量字符的varchar字段,其数据部分的存储大小将是每个字符的字节数之和。
假设我们有一个varchar(255)字段,其中确实存储了255个字符,且这些字符在UTF-8编码下平均每个字符占用3个字节(这只是一个假设,实际情况可能因字符集而异):
长度信息:因为字符数正好是255,所以使用1个字节来存储长度。
数据本身:255个字符 * 3字节/字符 = 765字节。
因此,这个varchar(255)字段在数据库中的总占用将是:1字节(长度)+ 765字节(数据)= 766字节。
需要注意的是,这个计算是基于假设的,并且没有考虑数据库管理系统(DBMS)可能添加的任何额外开销(如对齐填充等)。实际占用的空间可能会根据使用的DBMS和配置有所不同。
原文:
In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.