【问题标题】:SQL-Server is ignoring my COLLATION when I'm using LIKE operator当我使用 LIKE 运算符时,SQL-Server 忽略了我的 COLLATION
【发布时间】:2013-05-15 15:36:12
【问题描述】:

我正在使用西班牙语数据库,所以当我在寻找“aeiou”时,我也可以在这样的 where 子句中得到“áéíóú”或“AEIOU”或“ÁÉÍÓÚ”:

SELECT * FROM myTable WHERE stringData like '%perez%'

我正在消费:

* perez
* PEREZ
* Pérez
* PÉREZ

所以我将我的数据库更改为排序规则:Modern_Spanish_CI_AI

我只得到:

* perez
* PEREZ

但如果我这样做:

SELECT * FROM myTable WHERE stringData like '%perez%' COLLATE Modern_Spanish_CI_AI 

我得到所有结果都OK,所以我的问题是,为什么如果我的数据库是 COLLATE Modern_Spanish_CI_AI 我必须为我的查询设置相同的排序规则???

我使用的是 SQL-Server 2008

【问题讨论】:

  • stringdata 列可能与数据库有不同的排序规则
  • 没有简单的方法,尤其是在有限制的情况下。在 Google 上搜索“SQL 服务器更改排序规则”。它会给你带来噩梦。

标签: sql-server sql-server-2008 collation sql-like


【解决方案1】:

您需要更改表 COLUMN 本身的排序规则。

select collation_name, *
from sys.columns
where object_id = object_id('tblname')
  and name = 'stringdata';

如果你幸运的话,它就像(示例)一样简单

alter table tblname alter column stringdata varchar(20) collate Modern_Spanish_CI_AS

但是,如果您有约束和/或架构绑定引用,则可能会变得复杂。
使用具有混合排序规则的数据库可能非常困难,因此您可能需要重新排序所有表列。

【讨论】:

  • 你说得对,我可以一次将排序规则更改为我的所有数据结构吗?
【解决方案2】:

您可以使用COLLATE,例如。

SELECT * 
FROM TableName
WHERE strData COLLATE Latin1_general_CI_AI = 'perez' COLLATE Latin1_general_CI_AI

双方必须具有相同的排序规则。

其他:

【讨论】:

  • 谢谢你是一个很好的例子,但我想要的是不要在选择中使用“COLLATE”运算符我要取默认值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-14
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-10-01
相关资源
最近更新 更多