【问题标题】:Wrong sort order string with "ک" letter in SQL Server sort orderSQL Server 排序顺序中带有“带”字母的错误排序顺序字符串
【发布时间】:2020-06-17 20:49:27
【问题描述】:

我在使用 SQL Server 查询和波斯语时遇到了 Order By 的问题。我不能很好地对波斯文本进行排序。

我使用NVarchar(X) 类型并且一切都正确,即使是选择和喜欢查询。但是当我尝试对字符串字段进行排序时,即使在“ی”字母之后,我也看到只有字母“ک”在最后。现在我正在使用 Persian_100_CI_AS 排序规则。

例如

SELECT TOP (200) Id, Name
FROM Groups
ORDER BY Name DESC

结果是

ID       Name
------------------------------    
10071   کنترل کیفیت> مدیر
10018   کنترل کیفیت> پرسنل

在降序的情况下,前一行不应停留在第一行。

10040   وظایف - مدیریت
10031   واحد شبکه
10046   نیروی فنی - برق چاپ> پرسنل
10067   Iso 17025> پرسنل
10011    آزمایشگاه - فرمولها - شرایط خط - کنترل کیفیت - برنامه تولید - آمار - گزارش تولید
10043    آزمایشگاه - فرمولها - شرایط خط - کنترل کیفیت - آمار - گزارش تولید 2

任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server sql-order-by farsi


    【解决方案1】:

    您的字段的排序规则可能与您想象的不同。运行此查询以查看您的数据库中有什么。他们是Persian_100_CI_AS吗?

    DECLARE @defaultCollation NVARCHAR(1000)
    SET @defaultCollation = CAST(
          DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS NVARCHAR(1000)
      )
    
    SELECT C.Table_Name,
         Column_Name,
         Collation_Name,
         @defaultCollation DefaultCollation
    FROM   Information_Schema.Columns C
         INNER JOIN Information_Schema.Tables T
              ON  C.Table_Name = T.Table_Name
    WHERE  T.Table_Type = 'Base Table'
         AND RTRIM(LTRIM(Collation_Name)) <> RTRIM(LTRIM(@defaultCollation))
         AND COLUMNPROPERTY(OBJECT_ID(C.Table_Name), Column_Name, 'IsComputed') = 0
    ORDER BY
         C.Table_Name,
         C.Column_Name
    

    如果排序规则不同,请运行此查询,它会为您提供 Alter 语句来运行它们并修复不兼容的排序规则问题。

    DECLARE @defaultCollation NVARCHAR(1000)
    SET @defaultCollation = CAST(
          DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS NVARCHAR(1000)
      )
    
    
    select 'ALTER TABLE '
    + QUOTENAME(C.TABLE_SCHEMA)
    +'.'+ QUOTENAME(C.Table_Name)
    +' ALTER COLUMN ' +' [' +Column_Name+'] '
    +  DATA_TYPE+'('+cast(character_maximum_length as varchar(10))+')' +' COLLATE Persian_100_CI_AS '
    +(case IS_NULLABLE when 'YES' then 'NULL' else 'NOT NULL' end )+';'
    
    FROM   Information_Schema.Columns C
         INNER JOIN Information_Schema.Tables T
              ON  C.Table_Name = T.Table_Name
    WHERE  T.Table_Type = 'Base Table'
         AND RTRIM(LTRIM(Collation_Name)) <> RTRIM(LTRIM(@defaultCollation))
     --AND DATA_TYPE='nvarchar'
     AND character_maximum_length>0
    ORDER BY
         C.Table_Name,
         C.Column_Name
    

    【讨论】:

    • 这是正确的答案。谢谢你 Vahid jan
    • 索引也出现了另一个问题。您必须将数据复制到另一列并重新构建非聚集索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    相关资源
    最近更新 更多