English 中文(简体)
在字符数据库字段中区分“AB”和“Ab”
原标题:
  • 时间:2009-02-04 13:35:33
  •  标签:

具体来说,Sql Server 2005/T-Sql。我有一个字段,大多数是由两个字符组成的,它们都应该是大写的,但是有一些历史数据早于当前的DB/System,我需要找出哪些记录违反了大写契约。

我以为这会有效:

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

事实上,它返回了一些记录。它们已经被纠正了,现在查询没有返回任何数据。但是有人告诉我数据库中仍然有混合大小写的数据,我刚找到一个例子:FS和Fs报告相同的ASCII值。

为什么这种方法不可行?有什么更好的方法去解决问题,或者该怎么修改这种方法让它能够正常工作?

最佳回答

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

update tbl
set field1 = upper(field1)

但是为了回答你最初的问题,这个查询应该会给你期望的结果:

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

编辑:刚刚注意到使用COLLATE的建议也是由Ian发布的。

问题回答

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

您可以在整个数据库级别上更改排序规则,也可以针对特定查询在一个列上进行更改,因此:

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

如果你给ascii()函数传一个多字符字符串,它只会返回表达式中第一个字符的ASCII码。要进行你想要的比较,你需要看单个字符,而不是全部字段。

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

这可能奏效:

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

在SQL Server查询中描述的方法可能对您有用。大小写敏感搜索

根据 ASCII() 的文档 ,它只会返回最左边的字符。

I think you re going about this wrong. You could simply:

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

如果排序规则设定正确,为什么不修正排序规则呢?如果您无法永久更改它们,请尝试:

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




相关问题
热门标签