一、不同的emoji插入到mysql表中,出现唯一键冲突
业务场景:手机号注册用户,默认昵称为 宝宝+emoji+手机尾号,用户表中昵称字段要求唯一不可重复,存在唯一键。 (已使用utf8mb4字符集)
问题:
1、插入时 产生唯一键冲突
原因:字符集使用了utf8mb4,但它的默认排序集是 utf8mb4_general_ci 。utf8mb4_general_ci 不区分特殊字符, 不区分大小写。
概念:
字符:文字与符号的总称,包括文字、图形符号、数学符号等。英文26个字母,中文。
编码:将字符转为二进制的规则。如:ASCII码 A->65
字符集:一套字符与编码的合集。
排序集:指对字符集中字符串之间的比较、排序制定的规则。
解决:更改排序集(collate) 由默认的utf8mb4_general_ci改为utf8mb4_bin
alter table user_1 modify nickname nickname varchar(50) character set utf8mb4 collate utf8mb4_bin;
官网地址:MySQL :: MySQL Globalization :: 1.1 Character Sets and Collations in General
二、es中支持搜索emoji
常见分词器:
- standard 标准分词器 : 默认的分词器 识别空格、email、中文
- whitespace 空格分词器 : 只能对空格分词
- keyword 分词器 :不分词,整体作为一个单词
- ik 中文分词器 :第三方分词器,对中文支持较好 需要额外安装
- pinyin 拼音分词器 :第三方分词器,支持拼音检索 需要额外安装
- icu_analyzer icu分词器 :对中文支持较好,支持emoji,需要额外安装
问题:由于ik分词器不支持emoji表情,所以使用ik中文搜索时,无法根据表情和中文混合搜索。
解决:
1、当搜索关键词中包含emoji,指定分词器走icu分词器(支持中文,又支持emoji);
2、关键词中不包含emoji时,走ik(纯中文还是它香)。