如何查找字符超出A-Z0-9的字段

时间:2013-05-24 18:55:46

标签: sql-server tsql

我正在尝试查找数据超出正常A-Z,a-z,0-9范围的字段。 这些字段中包含数据:Café或Crème。

这不起作用:

select FieldData
from Field
WHERE FieldData not like '%[0-9A-Za-z]%'
group by FieldData

1 个答案:

答案 0 :(得分:2)

带有范围通配符的LIKE运算符为collation sensitive。这里的关键声明是:

  

在范围搜索中,范围中包含的字符可能会有所不同   取决于整理的排序规则。

基本上,范围中包含的字符可能与范围扩展时的预期不符。如果您找到一个排序规则,其中所有字母a-z / A-Z都在其重音对应物之前,则事情应该起作用。 binary sort collation归类应该这样做,其中:

  

根据语言环境定义的编码值序列对数据进行排序   和数据类型。

使用Latin1_General_BIN2_BIN2是SQL Server 2005 +,_BIN也应该有效),以下成功:

select FieldData
from (select 'abcd' as FieldData union 
      select '1234' union 
      select 'Café' union 
      select 'Crème') as Field
WHERE FieldData COLLATE Latin1_General_BIN2 like '%[^0-9A-Za-z]%'

--output:
--Café
--Crème

请注意,您必须将not like转换为like并将模式更改为“非”范围([^]),因为原始查询仍会将Café和Crème排除在外他们有非重音字符。