问题背景:

因为项目中某些需求,需要根据企业名称查询企业信息,但是企业输入名称和实际名称可能会有括号的全角半角问题,比如:自家系统中某企业名称“百度在线网络技术(北京)有限公司”,但是手动输入的名称是“百度在线网络技术(北京)有限公司”,这时候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条记录满足(用二进制排序结果同上相同)

解决方法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里需要统一。