sql server全角字符与半角字符的检验

发布时间:2020-03-03编辑:脚本学堂
本文介绍下,在sql server中有关全角字符与半角字符的检验问题,以及相关的处理方法,有需要的朋友参考下吧。

在sql server中,当半角字符F00000和全角字符F00000比较的结果是一样的,导致引起的重复的主键问题,全角的ASCII码是0xA3A8 ,而半角的是0x28。
为何SQL Server会认为是一样的呢?

原因分析:
这在于数据库的排序规则上:
SQL Server的排序规则由这样几部分组成,代码页、区分大小写、区分重音、区分宽度。
区分宽度:指定 SQL Server 区分相同字符的单字节表示法(半角)和双字节表示法(全角)。
如果没有选择,则 SQL Server 将认为相同字符的单字节表示法和双字节表示法等效。

缺省,安装SQL Server中文版的时候,SQL Server帮你选择的排序规则是Chinese_PRC_CI_AS(Chinese-PRC, case-insensitive, accent-sensitive, kanatype-insensitive, width-insensitive),是中文,不区分大小写、区分重音、不区分假名、不区分宽度。
因此,自然就认同F00000=F00000;
所以,正确的选择就是后缀为WS的中文排序规则。

以下介绍的例子中,应该选择Chinese_PRC_CI_AS_WS。

来看一下,指定排序规则是Chinese_PRC_CI_AS_WS后,会如何?
 

复制代码 代码示例:
select 1 where 'F00000'='F00000'
collate Chinese_PRC_CI_AS_WS
(所影响的行数为 0 行)

注意:查看使用哪个排序规则,可以使用如下的sql语句
 

复制代码 代码示例:
SELECT *
FROM ::fn_helpcollations()

可以查询所有排序规则的信息。
查出所有中文排序规则的信息:
 

复制代码 代码示例:
SELECT * FROM
(
SELECT *
FROM ::fn_helpcollations()) A
WHERE name like 'Chinese%'