Как использовать ORDER BY, LOWER в SQL SERVER 2008 с данными не в Юникоде - PullRequest
3 голосов
/ 30 марта 2010

Вопрос об армянском. Я использую SQL Server 2005, сопоставление SQL_Latin1_General_CP1_CI_AS, данные в основном на армянском языке, и мы не можем использовать юникод.

Я тестировал на MS SQL 2008 с сопоставлением Windows для армянского языка (Cyrillic_General_100_), я нашел здесь, (http://msdn.microsoft.com/en-us/library/ms188046.aspx), но это не помогло.

У меня есть функция, которая упорядочивает шестнадцатеричные значения, и младшая функция, которая берет каждый символ в каждой строке и преобразует его в младшую форму, но это неприемлемое решение, оно работает очень медленно, вызывая эти функции в каждом столбце огромный стол.

Есть ли какое-либо решение для этой проблемы, не использующее юникод и не работающее с шестнадцатеричными значениями вручную?

ОБНОВЛЕНИЕ:

С левой стороны слова со смешанным регистром, отсортированные в правильном порядке и с нижним регистром с правой стороны. Надеюсь, это поможет. Благодарю вас. Слова написаны в юникоде.

  1. ԱբԳդԵզ -> աբգդեզ

  2. ԱգԳսԴԼ -> ագգսդլ

  3. ԲաԴֆդԴ -> բադֆդդ

  4. ԳԳԼասա -> գգլասա

  5. ԴմմլօՏ -> դմմլօտ

  6. ԵլԲնՆն -> ելբննն

  7. ԶՎլուտ -> զվլուտ

  8. էԹփձջՐ -> էթփձջր

  9. ԸխԾդսՂ -> ըխծդսղ

  10. ԹԶէըԿր -> թզէըկր

Ответы [ 2 ]

3 голосов
/ 30 марта 2010

Одним из решений было бы создание вычисляемого столбца для каждого текстового столбца, который преобразует значение в армянское сопоставление и устанавливает его в нижний регистр следующим образом:

Alter Table TableName
    Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED

Как только вы это сделаете, вы можете поместить индексы в эти столбцы и запросить их.

Если это не ваш вкус чая, тогда другим решением будет индексированное представление, в котором вы создаете представление с SCHEMABINDING, которое переводит каждый из различных столбцов в нижний регистр и в правильное сопоставление, а затем помещает индексы в это мнение.

РЕДАКТИРОВАТЬ Я заметил в ваших примерах, что вы используете регистр-нечувствительный, акцент-чувствительный. Возможно, простым решением ваших проблем с заказом было бы использовать Latin1_General_CS_AS или Cyrillic_General_100_CS_AS, если доступно.

EDIT

Уф. После небольшого исследования, я думаю, у меня есть ответ, который, к сожалению, может быть, вам не понадобится. Во-первых, да, я могу скопировать предоставленный вами текст в код или что-то вроде Notepad ++, потому что StackOverflow кодируется с использованием UTF-8, а армянский будет вписываться в UTF-8. Во-вторых, это намекает на то, что вы пытаетесь достичь: хранение UTF-8 в SQL Server. К сожалению, SQL Server 2008 (или любая предыдущая версия) изначально не поддерживает UTF-8. Для хранения данных в UTF-8 у вас есть несколько вариантов:

  1. Сохраните его в двоичном виде и преобразуйте в UTF-8 на клиенте (что практически исключает любую сортировку, выполняемую на сервере)
  2. Сохраните его в Unicode и преобразуйте в UTF-8 на клиенте. Следует отметить, что драйвер SQL Server уже преобразует большинство строк в Unicode, и ваш пример отлично работает в Unicode. Очевидным недостатком является то, что он съедает вдвое больше места.
  3. Создайте пользовательский тип CLR в SQL Server для хранения значений UTF-8. Microsoft предоставляет пример, который поставляется с SQL Server, чтобы сделать это. Вы можете скачать образцы из CodePlex здесь . Вы также можете найти больше информации об образце в этой статье в Books Online . Недостатком является то, что вы должны включить CLR в SQL Server, и я не уверен, насколько хорошо он будет работать.

Теперь, как говорится, я смог без проблем получить пример работы с использованием Unicode в SQL Server.

If object_id('tempdb..#Test') Is Not Null
    Drop Table #Test
GO
Create Table #Test
(
    EntrySort int identity(1,1) not null
    , ProperSort int 
    , MixedCase nvarchar(50)
    , Lowercase nvarchar(50)
)
GO
Insert #Test(ProperSort, MixedCase, Lowercase)
Select 1, N'ԱբԳդԵզ',N'աբգդեզ'
Union All Select 6, N'ԵլԲնՆն',N'ելբննն'
Union All Select 2, N'ԱգԳսԴԼ',N'ագգսդլ'
Union All Select 3, N'ԲաԴֆդԴ',N'բադֆդդ'
Union All Select 4, N'ԳԳԼասա',N'գգլասա'
Union All Select 5, N'ԴմմլօՏ',N'դմմլօտ'
Union All Select 9, N'ԸխԾդսՂ',N'ըխծդսղ'
Union All Select 7, N'ԶՎլուտ',N'զվլուտ'
Union All Select 10, N'ԹԶէըԿր',N'թզէըկր'
Union All Select 8,N'էԹփձջՐ',N'էթփձջր'

Select * From #Test Order by ProperSort
Select * From #Test Order by Lowercase
Select * From #Test Order by Lower(MixedCase)

Все три из этих запросов возвращают один и тот же результат.

0 голосов
/ 30 марта 2010

Вы получили такую ​​ошибку?

Msg 448, Level 16, State 1, Line 1
Invalid collation 'Cyrillic_General_100_'.

Попробуйте:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

Или выберите тот, который вы предпочитаете из этого списка:

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
...