MySQL中utf8字符集、排序规则及utf8mb4_bin列大小写不敏感方法

utf8mb4 和 utf8 比较

UTF-8是使用1~4个字节,一种变长的编码格式。(字符编码web

mb4即 most bytes 4,使用4个字节来表示完整的UTF-8。而MySQL中的utf8是utfmb3,只有三个字节,节省空间但不能表达所有的UTF-8,只能支持“基本多文种平面”(Basic Multilingual Plane,BMP)。算法

推荐使用utf8mb4。sql

utf8mb4_unicode_ci 和 utf8mb4_general_ci 比较

general_ci 更快,unicode_ci 更准确函数

 in German and some other languages ß is equal to ss.编码

这种状况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 ,多是算法决定的吧?

utf8mb4_bin 列大小写不敏感方法

需求

  1. 插入的时候UmanUmānuman 看作不一样的单词。
  2. 查询的时候UmanUmānuman 都能同时查出来。

解决方案

使用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'),('Ä'),('Å'),('Â'),('Á'),('À');

1529141523561

根据需求,插入数据时:

  • UmanUmān 看作不一样的单词,因此要utf8_bin.

  • Umanuman看作相同的单词,因此添加unique约束,在utf8_bin区分大小写的状况下,使用low() 函数使其不区分大小写。

1529142760719

查询时:

  • 查询u8列,utf8mb4_unicode_ci不区分大小写、不区分a和ā。都能查出来。

1529142689449

相关文章
相关标签/搜索