我的MSSQL数据库设置为任何土耳其语排序系统都有问题。由于“土耳其语I”问题,我们在其中包含“i”的查询都没有正常工作。例如,如果我们有一个名为“Unit”的表,在这种情况下定义了一个“UnitID”列,则查询“select unitid from unit”不再有效,因为“id”中的小写“i”与定义的资本不同我在“UnitID”。错误消息显示为“无效的列名称'unitid'。”
我知道这是因为在土耳其语中,我和我的字母被视为不同的字母。但是,我不确定如何解决这个问题?不能选择通过DB中的所有1900 SP并更正“i”的外壳。
任何帮助都会受到赞赏,甚至可以使用其他排序规则的建议而不是土耳其语,但会支持他们的字符集。
答案 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)
将机器的区域设置更改为英语(美国)可以完全节省时间!