utf8mb4
: A UTF-8 encoding of the Unicode character set using one to four bytes per character.html
utf8mb3
: A UTF-8 encoding of the Unicode character set using one to three bytes per character.mysql
utf8
: An alias forutfmb3
.git(https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html)github
UTF-8是使用1~4个字节,一种变长的编码格式。(字符编码 )web
mb4即 most bytes 4,使用4个字节来表示完整的UTF-8。而MySQL中的utf8是utfmb3,只有三个字节,节省空间但不能表达所有的UTF-8,只能支持“基本多文种平面”(Basic Multilingual Plane,BMP)。算法
推荐使用utf8mb4。sql
general_ci 更快,unicode_ci 更准确函数
in German and some other languages
ß
is equal toss
.编码
这种状况unicode_ci能准确判断。code
具体有什么差异呢?参见下面的链接。
http://mysql.rjweb.org/utf8mb4_collations.html
utf8mb4_general_ci P=p Q=q R=r=Ř=ř S=s=ß=Ś=ś=Ş=ş=Š=š sh ss sz utf8mb4_unicode_ci P=p Q=q R=r=Ř=ř S=s=Ś=ś=Ş=ş=Š=š sh ss=ß sz
能够看到utf8mb4_general_ci中S=ß,而utf8mb4_unicode_ci中ss=ß 。
使用utf8mb4_bin能够将上面的字符区分开来。
貌似general_ci 也快不了多少,因此更推荐unicode_ci。
utf8mb4_general_cs 大小写敏感
utf8mb4_bin 大小写敏感
但貌似不存在utf8_unicode_cs ,多是算法决定的吧?
Uman
和Umān
和uman
看作不一样的单词。Uman
和Umān
和uman
都能同时查出来。使用MySQL虚拟生成列。MYSQL UTF8_bin case insensitive unique index
create table test_utf8_bin_ci ( u8 varchar(50) charset utf8mb4 collate utf8mb4_unicode_ci, u8_bin_ci varchar(50) charset utf8mb4 collate utf8mb4_bin as (lower(u8)) unique ); insert into test_utf8_bin_ci (u8) values ('A'),('Ä'),('Å'),('Â'),('Á'),('À');
根据需求,插入数据时:
Uman
和Umān
看作不一样的单词,因此要utf8_bin.
Uman
和 uman
看作相同的单词,因此添加unique约束,在utf8_bin区分大小写的状况下,使用low() 函数使其不区分大小写。
查询时: