土耳其SQL整理问题(土耳其语“I”)

时间:2009-04-23 07:31:05

标签: sql sql-server collation turkish

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

我知道这是因为在土耳其语中,我和我的字母被视为不同的字母。但是,我不确定如何解决这个问题?不能选择通过DB中的所有1900 SP并更正“i”的外壳。

任何帮助都会受到赞赏,甚至可以使用其他排序规则的建议而不是土耳其语,但会支持他们的字符集。

7 个答案:

答案 0 :(得分:5)

事实证明,最好的解决方案实际上是重构所有SQL和代码。

在过去的几天里,我编写了一个重构应用程序来修复所有存储过程,函数,视图,表名以保持一致并使用正确的大小写,例如:

select unitid from dbo.unit 

将更改为

select UnitId from dbo.Unit

然后,应用程序还会遍历代码并替换存储过程及其参数的所有出现,并更正它们以匹配数据库中定义的大小写。应用程序中的所有数据表都设置为不变的语言环境(感谢FXCop指出所有数据表..),这可以防止代码中的调用必须区分大小写。

如果有人想要该应用程序或有关此过程的任何建议,您可以通过dotnetvixen@gmail.com与我联系。

答案 1 :(得分:0)

也许我不明白这里的问题,但这不是更可能因为数据库区分大小写而你的查询不是吗?例如,在Sybase上,我可以执行以下操作:

USE master
GO
EXEC sp_server_info 16
GO

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

attribute_id   attribute_name     attribute_value 
          16   IDENTIFIER_CASE    MIXED

答案 2 :(得分:0)

如果您可以更改正在使用的排序规则,请尝试使用不变的语言环境。但请确保您不会影响客户名称和地址等其他内容。如果客户习惯于不区分大小写搜索他们自己的名字,他们就不会喜欢它,如果我和我不再相同,或者如果我和İ停止等同。

答案 3 :(得分:0)

您可以将数据库排序规则更改为默认值:这会使所有文本列都保留土耳其语吗?

查询将起作用,但数据将正常运行。理论上......

有一些带有varchar列的临时表和表变量的问题:你必须将COLLATE子句添加到这些

答案 4 :(得分:0)

我意识到您不想通过所有存储过程来解决问题,但也许您可以使用重构工具来解决问题。我说看看SQL Refactor。我没有使用它,但看起来很有希望。

答案 5 :(得分:0)

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

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

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

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

答案 6 :(得分:0)

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