SQLServer中区分中英文标点符号
- 问题出现背景
- 解决方法
- 方法一:修改表结构
- 方法二:自定义排序规则(COLLATE)
- COLLATE使用简述
在SQL Server中区分英文字母大小写、符号半角和全角
问题出现背景
最近在一个SQLServer的存储过程中遇到一个问题,其中有一段代码时去除字段中的英文标点符号和一些特殊字符,但是执行后中英文标点符号都被去除了。
自己进行测试并百度后,才知道SQLServer默认情况下是不区分中英文标点符号的,如下,我只想把英文右括号去掉,结果中文的右括号也没了
解决方法
方法一:修改表结构
对需要区分中英文符号的字段,设置其排序规则为Chinese_PRC,选择字典排序、区分全半角。
对比如下,name做了设置,address是默认设置
方法二:自定义排序规则(COLLATE)
方法一虽然简单直接,但往往遇到这类问题时不会使用方法一,原因有2个:
1、表中已有数据,修改字段排序规则,需要清空表中数据,得不偿失。
2、如果表是新建的,但是需要和其他表做关联,而其他表的排序规则是默认的,最后执行也会报错:
Cannot resolve the collation conflict between “SQL_Latin1_General_CP1_CI_AS” and “Chinese_PRC_CS_AI_WS” in the equal to operation.
不能解决equal to操作中“SQL_Latin1_General_CP1_CI_AS”与“Chinese_PRC_CS_AI_WS”的排序冲突。
所以这时在编写SQL时使用自定义的排序规则也可以解决问题,还是上面的例子:
如上,在指定字段后面加上 COLLATE Chinese_PRC_CS_AS_WS
,放在address或者替换符后面都可以。
COLLATE使用简述
下面的查询语句可得到SQLServer支持的所有排序规则select * from ::fn_helpcollations();
排序规则的后半部份即后缀 含义:
_BIN 二进制排序
_CI(CS) 是否区分大小写,CI不区分,CS区分
_AI(AS) 是否区分重音,AI不区分,AS区分
_KI(KS) 是否区分假名类型,KI不区分,KS区分
_WI(WS) 是否区分宽度 WI不区分,WS区分
区分大小写:如果想让比较将大写字母和小写字母视为不等,请选择该选项。
区分重音:如果想让比较将重音和非重音字母视为不等,请选择该选项。如果选择该选项, 比较还将重音不同的字母视为不等。
区分假名:如果想让比较将片假名和平假名日语音节视为不等,请选择该选项。
区分宽度:如果想让比较将半角字符和全角字符视为不等,请选择该选项
注:
很明显起作用的是_WS,但是在使用时不能直接写 COLLATE Chinese_PRC_WS
,会报错,似乎语法规则_CS_AS这两个参数是必填的,_KS和_WS是非必填,且顺序不能调换