代码之家  ›  专栏  ›  技术社区  ›  Madeleine

土耳其SQL排序规则(土耳其语“i”)的问题

  •  5
  • Madeleine  · 技术社区  · 15 年前

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

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

    任何帮助都会得到赞赏,即使是其他整理的建议,可以代替土耳其语,但将支持他们的字符集。

    7 回复  |  直到 9 年前
        1
  •  5
  •   Eric    14 年前

    结果发现,最好的解决方案实际上是重构所有SQL和代码。

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

    select unitid from dbo.unit 
    

    将更改为

    select UnitId from dbo.Unit
    

    然后,该应用程序还将遍历代码并替换任何出现的存储过程及其参数,并将其更正为与数据库中定义的情况相匹配。应用程序中的所有数据表都设置为不变的区域设置(感谢fxcop指出所有数据表..),这可以防止代码中的调用区分大小写。

    如果有人想要这个应用程序或者关于这个过程的任何建议,你可以在dotnetvixen@gmail.com上联系我。

        2
  •  0
  •   ninesided    15 年前

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

    USE master
    GO
    EXEC sp_server_info 16
    GO
    

    这说明我的数据库不区分大小写:

    attribute_id   attribute_name     attribute_value 
              16   IDENTIFIER_CASE    MIXED
    
        3
  •  0
  •   Windows programmer    15 年前

    如果您可以更改正在使用的排序规则,请尝试使用不变的区域设置。但是要确保你不会影响其他的事情,比如客户的名字和地址。如果一个客户习惯于不区分大小写地搜索自己的名字,那么如果我和_旃不再是等价物,或者我和_旃旃不再是等价物,他们就不会喜欢它。

        4
  •  0
  •   gbn    15 年前

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

    查询将工作,但数据将正常工作。从理论上说…

    有一些带有临时表的gotchas和带有varchar列的表变量:您必须向它们添加collate子句。

        5
  •  0
  •   Çağdaş Tekin    15 年前

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

        6
  •  0
  •   dr. evil    15 年前

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

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

    如果要在(_±-i,i”)中支持区分大小写,则可能会遇到问题,这在SQL Server中可能是一个需要支持的问题。如果整个入口都来自web,请确保它也是utf-8。

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

        7
  •  0
  •   Mahmut C    12 年前

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