2009-04-23 139 views
4

我遇到了我们的MSSQL数据库设置为任何土耳其语排序规则的问题。由于“土耳其语”问题,我们的查询中没有包含“我”,因此它们都能正常工作。例如,如果我们在这种情况下有一个名为“Unit”的表中有一个名为“UnitID”的列,那么查询“select unitid from unit”不再起作用,因为“id”中的小写“i”不同于定义的资本我在“UnitID”中。该错误消息将显示为“无效的列名”unitid“。”土耳其SQL排序问题(土耳其语“I”)

我知道这是因为在土耳其语中,我和我的字母被视为不同的字母。但是,我不确定如何解决这个问题?通过数据库中的所有1900 SP并不是一个选项,并且纠正了“我”的外壳。

任何帮助将不胜感激,甚至可以使用其他排序规则的建议,而不是土耳其语,但会支持他们的字符集。

+0

你可以发布一个链接到描述“土耳其我问题”的页面吗? – Tomalak 2009-04-23 08:09:24

+1

@Tomalak,看看这个网页:http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html – 2009-04-23 08:16:08

+0

我知道那个页面。但我不确定你是否做得对。 “土耳其测试”是关于解析数据的,但是您的问题描述听起来像是在SQL查询文本中使用土耳其语i--在任何情况下都不应该这样做。 – Tomalak 2009-04-23 08:55:23

回答

4

原来,最好的解决方案是实际重构所有的SQL和代码。

在过去的几天,我写了一个重构的应用解决了所有存储的特效,功能,视图,表名是一致的,并使用正确的外壳如:

select unitid from dbo.unit 

将改为

select UnitId from dbo.Unit 

该应用程序还通过代码并取代任何发生的存储过程及其参数,并纠正它们以匹配数据库中定义的情况。应用程序中的所有数据表都设置为不变的语言环境(感谢FXCop指出所有数据表..),这可以防止代码内的调用区分大小写。

如果有人想要该应用程序或有关流程的任何建议,您可以通过[email protected]与我联系。

0

也许我不明白这里的问题,但是这不太可能,因为数据库区分大小写,而您的查询不是?例如,在Sybase上我可以做到以下几点:

USE master 
GO 
EXEC sp_server_info 16 
GO 

,告诉我,我的数据库是不区分大小写:

attribute_id attribute_name  attribute_value 
      16 IDENTIFIER_CASE MIXED 
0

如果你可以改变你使用然后尝试整理不变的区域设置。但请确保您不会影响客户名称和地址等其他内容。如果客户习惯于对自己的名字进行大小写不敏感的搜索,他们不会喜欢它,如果我和我停止等同,或者如果我和我不再等价。

0

您可以将数据库排序规则更改为默认值:这将使所有文本列都与土耳其文相匹配吗?

查询可以正常工作,但数据会正常工作。从理论上讲...

有一些陷阱与临时表与varchar列表变量:你必须整理条款添加到这些

0

我知道你不想去通过所有的存储程序来解决这个问题,但也许你可以使用重构工具来解决问题。我说看看SQL Refactor。我没有使用它,但看起来很有希望。

0

我开发了很多带土耳其语支持的系统,这是众所周知的问题,正如你所说的。

将数据库设置更改为UTF-8的最佳做法就是这样。它应该解决所有问题。

如果您想在(ı-I,i-İ)中支持区分大小写,那么在SQL Server中可能会出现问题,您可能会遇到问题。如果整个入口都来自Web,那么确保UTF-8也是如此。

如果您将Web UTF-8输入和SQL Server设置保持为UTF-8,一切都应该顺利进行。

0

将机器的区域设置更改为英语(美国)可以完全节省时间!