问题背景:
因为项目中某些需求,需要根据企业名称查询企业信息,但是企业输入名称和实际名称可能会有括号的全角半角问题,比如:自家系统中某企业名称“百度在线网络技术(北京)有限公司”,但是手动输入的名称是“百度在线网络技术(北京)有限公司”,这时候mysql查询不出来,怎么办?
解决方法1:
在查询sql中做特殊处理:
select * from company where replace(replace(replace(replace(name, '(', ''),')',''),'(',''),')','') = #{name}
或者
select * from company where replace(replace(replace(replace(name, '(', ''),')',''),'(',''),')','') =
replace(replace(replace(replace(#{name}, '(', ''),')',''),'(',''),')','')
这种可以解决,但是速度慢
解决方法2(网上查的,不大好使):
SQL查询语句区分大小写、全角半角。。。。。
_CI_AI 不区分大小写、不区分重音、不区分假名类型、不区分宽度
_CI_AI_WS 不区分大小写、不区分重音、不区分假名类型、区分宽度
_CI_AI_KS 不区分大小写、不区分重音、区分假名类型、不区分宽度
_CI_AI_KS_WS 不区分大小写、不区分重音、区分假名类型、区分宽度
_CI_AS 不区分大小写、区分重音、不区分假名类型、不区分宽度
_CI_AS_WS 不区分大小写、区分重音、 不区分假名类型、区分宽度
_CI_AS_KS 不区分大小写、区分重音、区分假名类型、不区分宽度
_CI_AS_KS_WS 不区分大小写、区分重音、区分假名类型、区分宽度
_CS_AI 区分大小写、不区分重音、 不区分假名类型、不区分宽度
_CS_AI_WS 区分大小写、不区分重音、不区分假名类型、区分宽度
_CS_AI_KS 区分大小写、不区分重音、区分假名类型、不区分宽度
_CS_AI_KS_WS 区分大小写、不区分重音、区分假名类型、区分宽度
_CS_AS 区分大小写、区分重音、不区分假名类型、不区分宽度
_CS_AS_WS 区分大小写、区分重音、不区分假名类型、区分宽度
_CS_AS_KS 区分大小写、区分重音、区分假名类型、不区分宽度
_CS_AS_KS_WS 区分大小写、区分重音、区分假名类型、区分宽度
使用方法:
create table ta(id int ,name varchar(20))
insert ta
select 1, 'A' union all ---大写A
select 2, 'A'union all ---全角大写A
select 3, 'a,' union allselect 4, 'A,'
go
select * from ta where name like 'A%'--所有记录都会在结果集
select * from ta where name collate Chinese_PRC_CS_AS_WS like '%,%'--只有第4条记录满足
select * from ta where name collate Chinese_PRC_CS_AS_WS like 'a%'--第3条记录满足(加_ws与上一方法结果相同)
select * from ta where name collate Chinese_PRC_CS_AS_WS like 'A%'--第2条记录满足
select * from ta where name collate Chinese_PRC_BIN like'A'--第1条记录满足(用二进制排序结果同上相同)
链接(很多一样的,只是随便贴一个):
mysql查询时不区分全半角_SQL查询语句区分大小写、全角半角_天地玄黃的博客-****博客
解决方法3(感觉挺好使):
修改字段的collation
语句是:
ALTER TABLE company MODIFY COLUMN name varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
原来的默认是utf8mb4_general_ci,修改为utf8mb4_unicode_ci;
utf8mb4_unicode_ci和utf8mb4_general_ci的对比:
- 准确性:
- utf8mb4_unicode_ci是基于标准的Unicode来排序和比较,能够在各种语言之间精确排序
- utf8mb4_general_ci没有实现Unicode排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。
- 但是,在绝大多数情况下,这些特殊字符的顺序并不需要那么精确。
- 性能
- utf8mb4_general_ci在比较和排序的时候更快
- utf8mb4_unicode_ci在特殊情况下,Unicode排序规则为了能够处理特殊字符的情况,实现了略微复杂的排序算法。
- 但是在绝大多数情况下发,不会发生此类复杂比较。相比选择哪一种collation,使用者更应该关心字符集与排序规则在db里需要统一。
相关链接:
MySQL查看、修改字符集及Collation - 程序玩家 - 博客园
mysql中的utf8mb4、utf8mb4_unicode_ci、utf8mb4_general_ci - AmyZYX - 博客园