SQL深入学习:汉字编码与所占字节的关系
1、汉字编码
通常情况下,我们都是采用 UTF-8 的编码形式,例如创建表的时候往往是这样拼写SQL语句:
drop table if exists Test;
CREATE TABLE Test
(
id tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
username char(2) NOT NULL,
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='测试表';
在不同编码情况下,汉字和英文字母各占多少字节呢?可以看下面所列:
英文字母:
字节数: 1 编码:GB2312
字节数: 1 编码:GBK
字节数: 1 编码:GB18030
字节数: 1 编码:ISO-8859-1
字节数: 1 编码:UTF-8
字节数: 4 编码:UTF-16
字节数: 2 编码:UTF-16BE
字节数: 2 编码:UTF-16LE
中文汉字:
字节数: 2 编码:GB2312
字节数: 2 编码:GBK
字节数: 2 编码:GB18030
字节数: 1 编码:ISO-8859-1
字节数: 3 编码:UTF-8
字节数: 4 编码:UTF-16
字节数: 2 编码:UTF-16BE
字节数: 2 编码:UTF-16LE
2、列的存储限制
username char(2) NOT NULL,表示username存储2个字符,而不是两个字节。
INSERT INTO Test(username) VALUES('张三');
INSERT INTO Test(username) VALUES('张三李四');
> 1406 - Data too long for column 'username' at row 1
3、列的排序方式
主要有三种排序方式:utf8_bin、utf8_genera_ci、utf8_general_cs
(1)utf8_bin:将字符串中的每一个字符用二进制数据存储,区分大小写。
(2)utf8_genera_ci不区分大小写,ci是case insensitive的缩写,即一般大小写不敏感。作为密码时就会出现不合理的方面,而验证码则一般不区分大小写,所以用这个就合理。
(3)utf8_general_cs区分大小写,cs是case sensitive的缩写,即大小写敏感。utf8_general_cs这个选项一般不用,所以通常使用utf8_bin区分大小写。