先说问题,生僻字查询的问题,有的时候我们的数据里包含一些生僻字,在查询用Like模糊匹配的时候,发现有的查询不准确,测试数据如下:
1 --测试数据 2 if not object_id(N'Tempdb..#T') is null 3 drop table #T 4 Go 5 Create table #T([col] nvarchar(21)) 6 Insert #T 7 select N'䱗'UNION 8 SELECT N'啊' 9 Go 10 --测试数据结束
如果这时候用Like查询,就会存在查询不准确的情况:
Select * from #T WHERE col LIKE N'%䱗%'
查询结果:
两个数据都查询出来了,这时候我们使用COLLATE关键字,加上Chinese_PRC_BIN可以解决该问题:
Select * from #T WHERE col LIKE N'%䱗%' COLLATE Chinese_PRC_BIN
结果:
那么接下来我们说说问题原因和加的这个COLLATE Chinese_PRC_BIN 是什么意思。
生僻字由于在数据库中没有对应的编码,这样就会造成like的时候定位不到数据,所以解决这个问题也是从编码处入手,在排序的时候来做编码转换。
COLLATE简单来说就是用来定义排序规则的,具体详细介绍可以看官方文档 https://docs.microsoft.com/zh-cn/sql/t-sql/statements/collations?view=sql-server-ver15
SQLSERVER的排序规则有很多,Chinese_PRC_BIN是一种排序规则,该规则分为两部分,其中Chinese_PRC_是指针对大陆简体字UNICODE的排序规则,BIN指的是二进制排序选项,这些关联选项有很多 ,例如:
上边列举了几个例子,如果想了解更多,可以到微软官网了解 https://docs.microsoft.com/zh-cn/sql/relational-databases/collations/collation-and-unicode-support?view=sql-server-ver15