MySQL中utf8字符集、排序規則及utf8mb4_bin列大小寫不敏感方法
轉載:https://my.oschina.net/u/1245414/blog/1831347
一、utf8mb4 和 utf8 比較
utf8mb4
: A UTF-8 encoding of the Unicode character set using one to four bytes per character.utf8mb3
: A UTF-8 encoding of the Unicode character set using one to three bytes per character.utf8
: An alias forutfmb3
.(https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
UTF-8是使用1~4個位元組,一種變長的編碼格式。(字元編碼 )
mb4即 most bytes 4,使用4個位元組來表示完整的UTF-8。而MySQL中的utf8是utfmb3,只有三個位元組,節省空間但不能表達全部的UTF-8,只能支援“基本多文種平面”(Basic Multilingual Plane,BMP)。
推薦使用utf8mb4。
二、utf8mb4_unicode_ci 和 utf8mb4_general_ci 比較
general_ci 更快,unicode_ci 更準確
in German and some other languages
ß
is equal toss
.
這種情況unicode_ci能準確判斷。
具體有什麼差別呢?參見下面的連線。
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 ,可能是演算法決定的吧?
四、utf8mb4_bin 列大小寫不敏感方法
需求
- 插入的時候
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() 函式使其不區分大小寫。
查詢時:
- 查詢u8列,utf8mb4_unicode_ci不區分大小寫、不區分a和ā。都能查出來。