【问题标题】:Sort Multiple language data in SQL Server by collation (Why my query does not work)按排序规则对 SQL Server 中的多语言数据进行排序(为什么我的查询不起作用)
【发布时间】:2025-12-13 01:10:01
【问题描述】:

我有一个包含多种语言数据的表​​格列。

我需要根据我指定的语言(例如印地语)进行排序。

如何通过排序或其他方式实现它?

  • 列名:Comments
  • 类型:Nvarchar(MAx)

示例列数据

    This is an example
    To je příklad.
    هذا مثال على ذلك.
    उदाहरण है.
    यह एक उदाहरण है.
    ಈ ಒಂದು ಉದಾಹರಣೆಯಾಗಿದೆ.

“印地语”排序后的输出应该是:

उदाहरण है.
यह एक उदाहरण है.
This is an example
To je příklad.
هذا مثال على ذلك.
ಈ ಒಂದು ಉದಾಹರಣೆಯಾಗಿದೆ.

使用的脚本:

CREATE TABLE dbo.Data
( unicodeData NVARCHAR(200)
)
GO
INSERT INTO dbo.Data ( unicodeData)
VALUES
 ( N'This is an example')
, (N'यह एक उदाहरण है.')
, (N'उदाहरण है.')
, (N'ಈ ಒಂದು ಉದಾಹರಣೆಯಾಗಿದೆ.')
, (N'एक उदाहरण है.')
, (N'هذا مثال على ذلك.')
, (N'To je příklad.');
GO

select * from dbo.unicodeData
order by unicodedata Collate Indic_General_100_CI_AI

【问题讨论】:

  • 哪个数据库? sql server,oracle?
  • Sql Server 2008 R2/2012

标签: sql-server sorting collation hindi


【解决方案1】:

使用Order by Column COLLATE 语法。需要使用Indic_General_90_CI_AS 排序规则。既然这样

参考资料说印地语(在此(2005)版本中已弃用) 已停产并由 Indic_General_90_CI_AS 取代(仅限 Unicode)。

SELECT Comments from TABLEX
ORDER BY Comments 
COLLATE Indic_General_90_CI_AS ASC;

整理和排序通常只使用一种语言。您想要多语言排序,您需要为您的数据添加自定义值。我将 languageSortingPriority 列添加到您的表中,然后使用 languageSortingPriority 列进行排序。

CREATE TABLE dbo.unicodeData
( 
  languageUsed VARCHAR(50)
  ,languageSortingPriority int
, unicodeData NVARCHAR(200)
, nonUnicodeData VARCHAR(200) -- same data in a normal VARCHAR column for comparison
, comments VARCHAR(100)
)
GO
INSERT INTO dbo.unicodeData (languageUsed, languageSortingPriority,unicodeData, nonUnicodeData, comments)
VALUES
 ('English', 2, N'This is an example', N'This is an example', NULL)
, ('Hindi', 1,N'यह एक उदाहरण है.', N'यह एक उदाहरण है.', 'Using the preceding N in both strings but VARCHAR is still a ?')
, ('Hindi', 1, N'यह एक उदाहरण है.', 'यह एक उदाहरण है.', 'Not using the preceding N in both strings so both are a ?')
, ('Kannada' ,3, N'ಈ ಒಂದು ಉದಾಹರಣೆಯಾಗಿದೆ.', N'ಈ ಒಂದು ಉದಾಹರಣೆಯಾಗಿದೆ.', NULL)
, ('Arabic', 3,N'هذا مثال على ذلك.', N'هذا مثال على ذلك.', NULL)
, ('Czech', 2 ,N'To je příklad.', N'To je příklad.', NULL);
GO

select * from dbo.unicodeData
order by languageSortingPriority,unicodedata Collate Indic_General_100_CI_AI DESC

在此处查看sql fiddle

【讨论】:

  • 您好 Atilla,感谢您的快速回复,但您给定的查询未提供我评论中提到的所需输出。我使用了以下脚本,但没有成功。
  • @Shashank 这是内置解决方案。如果您需要一些特别的东西,您应该更新您的问题以提供更多信息?例如,您可以添加“为什么我的查询不起作用?”
  • 嗨 Atilla,感谢您的回复,您能否进一步解释一下您的陈述,即“通常仅使用一种语言进行排序和排序”。
    您能否描述排序规则的工作方式?具有多种语言数据的列的任何特定语言(在我的情况下为印地语)的详细信息。
  • 您好,Atilla Ozgur,使用一种特定的整理来对多种语言数据进行排序会导致所有其他语言的排序错误。例如使用 Atilla 的答案,它使用特定的整理 Indic_General_100_CI_AI 并不适合用户使用的所有语言。
【解决方案2】:

您好,我已经在 MSDN 论坛上回答了 OP 问题。基本上你需要按每个排序规则排序。

你可以在这里看到原始线程,答案是: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ccc1d16f-926f-46c8-8579-b2eecf661e7c/sort-miultiple-language-data-in-sql-serevr-by-collation?forum=transactsql

您可以在此处在 TechNet 上查看有关此问题的文章: http://social.technet.microsoft.com/wiki/contents/articles/31194.t-sql-sort-data-by-multiple-languages.aspx

我希望这有用:-)

【讨论】: