Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 区别于;AB";及;Ab";在字符数据库字段中_Sql_Sql Server_Database_Ascii - Fatal编程技术网

Sql 区别于;AB";及;Ab";在字符数据库字段中

Sql 区别于;AB";及;Ab";在字符数据库字段中,sql,sql-server,database,ascii,Sql,Sql Server,Database,Ascii,特别是Sql Server 2005/T-Sql。我有一个主要由两个字符组成的字段,它们都应该是大写的,但有一些旧数据早于当前的DB/系统,我需要找出哪些记录违反了大写约定 我认为这会奏效: select * from tbl where ascii(field1) <> ascii(upper(field1)) 从tbl中选择*其中ascii(字段1)ascii(上限(字段1)) 事实上,它还给了我一些记录。它们已被更正,现在该查询不返回任何数据。但有人告诉我,数据库中仍然存在

特别是Sql Server 2005/T-Sql。我有一个主要由两个字符组成的字段,它们都应该是大写的,但有一些旧数据早于当前的DB/系统,我需要找出哪些记录违反了大写约定

我认为这会奏效:

select * from tbl where ascii(field1) <> ascii(upper(field1))
从tbl中选择*其中ascii(字段1)ascii(上限(字段1))
事实上,它还给了我一些记录。它们已被更正,现在该查询不返回任何数据。但有人告诉我,数据库中仍然存在混合大小写数据,我刚刚发现了一个例子:“FS”和“FS”都报告相同的ascii值


为什么这种方法有缺陷?有什么更好的方法可以实现这一点,或者如何修复此方法以正确工作?

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

函数的作用是:只返回字符表达式最左边字符的ASCII码值。改为使用大写()。

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

update tbl
set field1 = upper(field1)
但要回答您的原始问题,此查询应提供您期望的结果:

select * from tbl
where field1 COLLATE Latin1_General_CS_AS <> upper(field1)
从tbl中选择*
其中字段1将拉丁语1\u General\u CS\u与upper(字段1)进行对比

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

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

您可以更改整个数据库级别的排序规则,也可以更改特定查询的一列排序规则,以便:

SELECT myColumn 
  FROM myTable  
  WHERE myColumn COLLATE Latin1_General_CS_AS <> upper(myColumn)
选择myColumn
从myTable
其中myColumn将Latin1\u General\u CS\u比较为upper(myColumn)
这可能有效:

select * from tbl 
where cast(field1 as varbinary(256)) <> cast(upper(field1) as varbinary(256))
从tbl中选择*
其中强制转换(字段1为varbinary(256))强制转换(上部(字段1)为varbinary(256))
中描述的方法可能对您有用。

根据,它只返回最左边的字符

我认为你做得不对。 你可以简单地:

select * from tbl where field1 <> upper(field1)
从tbl中选择*,其中字段1位于上方(字段1)
如果排序规则设置正确?如果无法永久更改,请尝试:

select * from tbl where
          (field1 collate Latin1_General_CS_AS)
  <> upper(field1 collate Latin1_General_CS_AS)
从tbl中选择*,其中
(字段1核对拉丁语1\u一般\u CS\u AS)
上部(字段1对比拉丁语1\u一般\u CS\u AS)

np,但我认为@tehvan有一个优点,那就是你可以完全省略ASCII的使用。我需要找到错误的特定记录,以便我可以报告哪些记录被更改。你也可以在查询中使用COLLATE Latin1_General_CS_AS,强制该查询中的一列区分大小写。我同意,这是一个更好的方法,我没有考虑。谢谢你的帽子提示……