SQLServer中区分中英文标点符号

  • 问题出现背景
  • 解决方法
  • 方法一:修改表结构
  • 方法二:自定义排序规则(COLLATE)
  • COLLATE使用简述



在SQL Server中区分英文字母大小写、符号半角和全角

问题出现背景

最近在一个SQLServer的存储过程中遇到一个问题,其中有一段代码时去除字段中的英文标点符号和一些特殊字符,但是执行后中英文标点符号都被去除了。

自己进行测试并百度后,才知道SQLServer默认情况下是不区分中英文标点符号的,如下,我只想把英文右括号去掉,结果中文的右括号也没了

mysql根据中英文拼音全称排序怎么排的 mysql查询区分中英文括号_SQL

解决方法

方法一:修改表结构

对需要区分中英文符号的字段,设置其排序规则为Chinese_PRC,选择字典排序、区分全半角。

mysql根据中英文拼音全称排序怎么排的 mysql查询区分中英文括号_SQL_02


对比如下,name做了设置,address是默认设置

mysql根据中英文拼音全称排序怎么排的 mysql查询区分中英文括号_编辑器_03

方法二:自定义排序规则(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时使用自定义的排序规则也可以解决问题,还是上面的例子:

mysql根据中英文拼音全称排序怎么排的 mysql查询区分中英文括号_SQL_04

如上,在指定字段后面加上 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是非必填,且顺序不能调换