mysql 256byte可以存多少汉字,字符编码length,char_length函数

mysql 256byte可以存多少汉字,字符编码length,char_length函数

在MySQL中,UTF-8编码下,每个汉字至少占用3个字节。因此,256字节可以存储的汉字数量为:
(256字节) / (3字节/汉字) = 85.3汉字

由于UTF-8编码中,对于单字节的字符、双字节字符和三字节字符有不同的编码方式,实际使用中可能不能完全均匀分配这256个字节,这样算下来可能存储的汉字数量会更少。但是,这个计算给出了一个大致的范围。
请注意,由于MySQL在存储汉字时可能会使用额外的字节来完成UTF-8编码,所以实际能存储的汉字数量会更少。例如,对于4字节的UTF-8编码(用于表示扩展字符),每个字符将占用4个字节,这将进一步减少可存储的汉字数量。
实际应用中,考虑到数据库表的其他开销,如行首位、字段分隔符等,实际存储汉字的数量可能会更少。所以,在设计数据库表的时候,应当考虑到这些因素,并适当减少预期的存储量。

一个中文汉字占多少字节与编码有关
在mysql中,一个中文汉字所占的字节数与编码格式有关:如果是GBK编码,则一个中文汉字占2个字节;如果是UTF8编码,则一个中文汉字占3个字节,而英文字母占1字节。

UTF8:一个中文汉字=3个字节 utf-8, 英文字母1字节
GBK:一个中文汉字=2个字节 gbk, 英文字母2字节

函数
length()返回字节数,char_length()返回字符数。


GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312 --> Unicode --> UTF8
UTF8 --> Unicode -> GBK、GB2312

GB2312是GBK的子集,GBK是GB18030的子集
GBK是包括中日韩字符的大字符集合
为了避免所有乱码问题,应该采用UTF-8,将来要支持国际化也非常方便
UTF8可以看作是大字符集,它包含了大部分文字的编码。
使用UTF8的一个好处是其他地区的用户(如香港台湾)无需安装简体中文支持就能正常观看你的文字而不会出现乱码。

gb2312是简体中文的码
gbk支持简体中文及繁体中文
big5支持繁体中文
utf8支持几乎所有字符

mysql demo: 
#创建表
CREATE TABLE `book` (
  `SNO` VARCHAR(3) NOT NULL,
  `SNAME` VARCHAR(9) NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

#添加数据
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('001','KangKang');
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('002','Mike');
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('003','Jane');
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('123','test');
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('124','test1');
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('中国人','长城');

#添加超出字符长度的测试:Data too long for column 'SNO' at row 1
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('124a','test1');
INSERT INTO `book` (`SNO`, `SNAME`) VALUES('中国人a','长城');

SELECT sno,sname,LENGTH(sno),CHAR_LENGTH(sno) FROM `book`;
#查询返回结果:
"sno"    "sname"    "length(sno)"    "char_length(sno)"
"001"    "KangKang"    "3"    "3"
"002"    "Mike"        "3"    "3"
"003"    "Jane"        "3"    "3"
"123"    "test"        "3"    "3"
"124"    "test1"        "3"    "3"
"中国人"    "长城"    "9"    "3"

结论:
在字符集为UTF-8的情况下:
若 MySQL version < 4.1:VARCHAR以字节为单位存储,假设全部为常用汉字,则VARCHAR(255)共可存放约85个汉字。
若 MySQL version >= 4.1:VARCHAR以字符为单位存储,假设全部为常用汉字,则VARCHAR(255)可以存放255个汉字。
当然,现在MySQL基本都大于4.1版本的,所以说MySQL中varchar(n)表示n个字符,无论汉字和英文,Mysql都能存入n个字符,仅是实际字节长度有所区别。

posted on 2024-12-09 18:47  oktokeep  阅读(36)  评论(0编辑  收藏  举报