mysql查询全角半角问题

问题背景:

因为项目中某些需求,需要根据企业名称查询企业信息,但是企业输入名称和实际名称可能会有括号的全角半角问题,比如:自家系统中某企业名称“百度在线网络技术(北京)有限公司”,但是手动输入的名称是“百度在线网络技术(北京)有限公司”,这时候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查询语句区分大小写、全角半角_天地玄黃的博客-CSDN博客

解决方法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 - 博客园

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心若自由何处是束缚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值