在做公众号或者小程序的时候,经常会遇到存的用户的昵称是emoji表情的,这种在处理的时候比较麻烦。
1、存储问题
由于emoji表情4个字节的,而数据库中的utf-8的字符集实际上并不是真正的utf8,之后mysql又出了一个新的字符集utf8mb4,这个才是我们平时所说的utf-8。所以首先存储的话,需要保证数据库表的字符集以及该字段的字符集要是utf8mb4才可以。
2、查询问题
存储没问题了之后,查询的时候对于emoji的模糊查询会报错
[Err] 1267 - Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation 'like'
1.第一种解决方式:运用sql的CONVERT(字段 USING 字符集)函数进行强制转换
从报错信息入手,我从网上先开始找到的解决方式是把传进来的字段进行强制的字符集转换,类似于
t1.remark_name LIKE CONVERT(CONCAT("%", #{content}, "%") USING utf8mb4)
OR t2.nickname LIKE CONVERT(CONCAT("%", #{content}, "%") USING utf8mb4)
运用sql的CONVERT(字段 USING 字符集)函数进行强制转换,这样转换过后就不会报错了,但是还有问题就是对于emoji表情的搜索并不准确,输入表情什么都搜不到。
之后我又着手优化,在网上找到了另一种方式,这种方式可以搜索到表情。
2.第二种解决方式:在要搜索的字段前面加上关键字BINARY
BINARY t1.remark_name LIKE CONCAT("%", #{content}, "%")
OR BINARY t2.nickname LIKE CONCAT("%", #{content}, "%")
就是在要搜索的字段前面加上关键字BINARY,这样就能够搜索到表情。然而这种方式是区分大小写的,如果没有加这个关键词对于英文是可以不区分大小写进行搜索的,加了之后是严格区分大小写的。所以这个就要看大家自己取舍了。