5

我在将我们的 MSSQL 数据库设置为任何土耳其排序规则时遇到问题。由于“土耳其语 I”问题,我们的查询中没有一个包含“i”的查询正常工作。例如,如果我们有一个名为“Unit”的表,其中定义了列“UnitID”,则查询“select unitid from unit”不再有效,因为“id”中的小写“i”与定义的大写字母不同我在“UnitID”中。错误消息将显示“无效的列名 'unitid'”。

我知道这是因为在土耳其语中,字母 i 和 I 被视为不同的字母。但是,我不确定如何解决此问题?遍历数据库中的所有 1900 SP 并更正“i”的大小写不是一种选择。

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

4

7 回答 7

5

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

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

select unitid from dbo.unit 

将更改为

select UnitId from dbo.Unit

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

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

于 2009-04-27T19:08:46.377 回答
1

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

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

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

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

于 2009-04-23T10:12:22.950 回答
0

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

USE master
GO
EXEC sp_server_info 16
GO

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

attribute_id   attribute_name     attribute_value 
          16   IDENTIFIER_CASE    MIXED
于 2009-04-23T07:52:34.720 回答
0

如果您可以更改正在使用的排序规则,请尝试使用 Invariant 语言环境。但请确保您不会影响其他内容,例如客户姓名和地址。如果客户习惯于搜索自己的姓名时不区分大小写,如果 ı 和 I 不再等价,或者 i 和 İ 不再等价,他们将不会喜欢这种做法。

于 2009-04-23T08:04:35.627 回答
0

您能否将数据库排序规则更改为默认值:这将使您的所有文本列都使用土耳其语排序规则?

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

临时表和带有 varchar 列的表变量有一些陷阱:您必须向这些添加 COLLATE 子句

于 2009-04-23T08:07:56.727 回答
0

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

于 2009-04-23T10:05:52.047 回答
0

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

于 2012-10-05T11:55:07.437 回答