【问题标题】:Differentiating between "AB" and "Ab" in a character Database Field区分字符数据库字段中的“AB”和“Ab”
【发布时间】:2009-02-04 13:35:33
【问题描述】:

具体来说,Sql Server 2005/T-Sql。我有一个主要是一系列两个字符的字段,它们都应该是大写的,但是有一些旧数据早于当前的数据库/系统,我需要找出哪些记录违反了大写外壳契约。

我认为这会起作用:

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

事实上,它还给了我一些记录。此后它们已被更正,现在该查询不返回任何数据。但有人告诉我,数据库中仍然存在大小写混合数据,我刚刚找到了一个示例:“FS”和“Fs”都报告了相同的 ascii 值。

为什么这种方法有缺陷?有什么更好的方法来解决这个问题,或者我该如何修复这种方法以使其正常工作?

【问题讨论】:

    标签: sql sql-server database ascii


    【解决方案1】:

    如果所有日期都应该是大写的,那就更新一下

    update tbl
    set field1 = upper(field1)
    

    但要回答您的原始问题,此查询应该会给您预期的结果:

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

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

    【讨论】:

    • 我同意,这是一种更好的方法,我没有考虑过。
    • 感谢您的提示... :)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • np,但我认为@tehvan 有一个很好的观点,您可以完全省略 ASCII 的使用。
      • 我需要找到错误的具体记录,以便我可以报告哪些记录发生了更改。
      • 您还可以在查询中使用 COLLATE Latin1_General_CS_AS 来强制该查询中的那一列区分大小写。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        这可能有效:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            根据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)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-12-23
              • 2021-02-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多