一、MySQL中length()、char_length()的区别和用法
char_length(str)
- 计算单位:字符
- 不管汉字还是数字或者是字母都算是一个字符
length(str)
- 计算单位:字节
- utf8编码:一个汉字三个字节,一个数字或字母一个字节。
- gbk编码:一个汉字两个字节,一个数字或字母一个字节。
mysql> SELECT CHAR_LENGTH('码农') '字符', LENGTH('码农') '字节';
+------+------+
| 字符 | 字节 |
+------+------+
| 2 | 6 |
+------+------+
mysql> SELECT CHAR_LENGTH('码农Lin') '字符', LENGTH('码农Lin') '字节';
+------+------+
| 字符 | 字节 |
+------+------+
| 5 | 9 |
+------+------+
mysql> SELECT CHAR_LENGTH('码农Lin1') '字符', LENGTH('码农Lin1') '字节';
+------+------+
| 字符 | 字节 |
+------+------+
| 6 | 10 |
+------+------+
扩展
MySQL5.0.3版本之后varchar类型大小的计算方式有所变化,从最早的按字节算大小varchar(length)改成了varchar(char_length)。
- MySQL 5.0.3 之前:
- 数据类型大小:0–255字节
- 详解:varchar(20)中的20表示字节数,如果存放utf-8编码的话只能放6个汉字。varchar(n),这里的n表示字节数。
- MySQL 5.0.3之后:
- 数据类型大小:0–65535字节,但最多占65532字节(其中需要用两个字节存放长度,小于255字节用1个字节存放长度)
- 详解:varchar(20)表示字符数,不管什么编码,不管是英文还是中文都可以存放20个。
二、utf8mb4用途
MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。
低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。
这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。
将emoji文字直接写入SQL中,执行insert语句报错;
INSERT INTO `csjdemo`.`student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`)
VALUES ('20', '陈哈哈 标签:字符,编码,字节,utf8mb4,utf8,MySQL,length,mysql,+------+------+ From: https://blog.51cto.com/u_15891990/5908823