SQL Server Collation / ADO.NET DataTable.Locale с разными языками - PullRequest
2 голосов
/ 26 апреля 2010

у нас есть приложение WinForms, которое хранит данные в SQL Server (2000, мы работаем над его портированием в 2008 году) через ADO.NET (1.1, работаем над портированием на 4.0). Все работает нормально, если я читаю данные, ранее написанные в западноевропейской локали (например, «тест», «тест ù»), но теперь мы должны иметь возможность смешивать западный и незападный алфавиты (например, тест ۓےۑ "- это просто случайные арабские буквы).

На стороне SQL Server для базы данных задано сопоставление Latin1_General, поле имеет значение nvarchar(80). Если я запускаю инструкцию SQL SELECT (например, «SELECT * FROM MyTable WHERE field = 'test - ۓےۑ'», не обращая внимания на «*» или на фактические имена) из Query Analyzer, я не получаю результатов; то же самое происходит, если я передаю инструкцию Sql в ADO.NET DataAdapter для заполнения DataTable. Я предполагаю, что это как-то связано с сопоставлением, но я не знаю, как это исправить: нужно ли переходить на сопоставление (SQL Server) на другое? Или мне нужно установить локаль в DataAdaoter / DataTable (ADO.NET)?

Заранее спасибо всем, кто поможет

Ответы [ 2 ]

3 голосов
/ 30 апреля 2010

Если вы не используете N при сравнении nvarchar с расширенным символом. установлен

SELECT * From TestTable WHERE GreekColCaseInsensitive = N'test - ۓےۑ'
1 голос
/ 30 апреля 2010

Да, проблема скорее всего в сопоставлении. Параметры сортировки Latin1_General не включают правила сортировки и сравнения нелатинских символов.

MSDN утверждает:

Если вам необходимо хранить символьные данные, отражающие несколько языков, вы можете минимизировать проблемы совместимости сопоставления, всегда используя типы данных Unicode nchar, nvarchar и ntext вместо типов данных char, varchar, text. Использование типов данных Unicode устраняет проблемы преобразования кодовой страницы.

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

Кроме того, я хочу добавить, что просто изменить параметры сортировки непросто, проверьте MSDN для SQL 2000:

При настройке SQL Server 2000 важно использовать правильные параметры сортировки. Вы можете изменить параметры сортировки после запуска программы установки, но вы должны перестроить базы данных и перезагрузить данные. Для этих вариантов рекомендуется разработать стандарт в своей организации. Многие межсерверные действия могут завершиться ошибкой, если параметры сортировки не одинаковы для разных серверов.

Однако можно указать параметры сортировки для каждого столбца:

CREATE TABLE TestTable (
   id int,  
   GreekColCaseInsensitive nvarchar(10) collate greek_ci_as,
   LatinColCaseSensitive nvarchar(10) collate latin1_general_cs_as
   )

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

Если вы не можете или не хотите изменить параметры сортировки столбца, вы также можете просто указать параметры сортировки, которые будут использоваться в запросе, например:

SELECT * From TestTable 
WHERE GreekColCaseInsensitive = N'test - ۓےۑ'
COLLATE latin1_general_cs_as

Как jfrobishow указал, что использование N перед строкой, которую вы хотите использовать для сравнения, является существенным. Что он делает:

Обозначает, что следующая строка в Unicode (N фактически обозначает набор символов на национальном языке). Это означает, что вы передаете значение NCHAR, NVARCHAR или NTEXT, а не CHAR, VARCHAR или TEXT. См. Статью 2354 для сравнения этих типов данных.

Вы можете найти краткое изложение здесь .

...