Как использовать ORDER BY, LOWER в SQL SERVER 2008 с данными, не поддерживающими Юникод

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

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

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

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

ОБНОВИТЬ:

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

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

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

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

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

РЕДАКТИРОВАТЬ

Уф. После долгих исследований, я думаю, у меня есть ответ, который, к сожалению, может быть, вам не понадобится. Во-первых, да, я могу скопировать предоставленный вами текст в код или что-то вроде Notepad++, потому что Stackru кодируется с использованием 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 здесь. Вы также можете найти больше информации об образце в этой статье в Книгах Онлайн. Недостатком является то, что вы должны включить 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)

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

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

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_%'
Другие вопросы по тегам