区分字符数据库字段中的“AB”和“Ab”

时间:2009-02-04 13:35:33

标签: sql sql-server database ascii

具体来说,是Sql Server 2005 / T-Sql。我有一个字段,主要是一系列的两个字符,并且它们都应该是大写的,但是有一些遗留数据早于当前的DB / System,我需要弄清楚哪些记录违反了上层套管契约。

我认为这样可行:

select * from tbl where ascii(field1) <> ascii(upper(field1))

确实它给了我一些记录。它们已被纠正,现在该查询不返回任何数据。但是我有人告诉我数据库中仍有混合的案例数据,我只是找到了一个例子:'FS'和'Fs'都报告了相同的ascii值。

为什么这种方法存在缺陷?有什么更好的方法可以解决这个问题,或者我如何才能使这种方法正常工作?

7 个答案:

答案 0 :(得分:5)

如果所有日期都应该是大写的,只需进行更新

update tbl
set field1 = upper(field1)

但要回答原始问题,此查询应该会为您提供您期望的结果:

select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)

编辑:注意到使用COLLATE的建议也由Ian

发布

答案 1 :(得分:3)

ASCII只比较第一个字母。您必须比较每个字母,或更改数据库归类以区分大小写。

您可以更改整个数据库级别的排序规则,或仅针对特定查询更改一列,因此:

SELECT myColumn 
  FROM myTable  
  WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)

答案 2 :(得分:2)

如果将多个字符串传递给表达式,则ascii()函数将仅返回表达式中第一个字符的ascii编号。要进行比较,您需要查看单个字符,而不是整个字段。

答案 3 :(得分:1)

ASCII()函数仅返回字符表达式最左侧字符的ASCII代码值。改为使用UPPER()。

答案 4 :(得分:1)

这可能有效:

select * from tbl 
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))

答案 5 :(得分:1)

Case sensitive search in SQL Server queries中描述的方法可能对您有用。

答案 6 :(得分:0)

根据documentation for ASCII(),它只返回最左边的字符。

我认为你错了。 你可以简单地说:

select * from tbl where field1 <> upper(field1)

如果正确设置了整理规则,so why not fix the collation rules?如果您无法永久更改它们,请尝试:

select * from tbl where
          (field1 collate Latin1_General_CS_AS)
  <> upper(field1 collate Latin1_General_CS_AS)
相关问题