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区分大小写。

标签: none

添加新评论