Проблемы с турецкой SQL Collation (турецкое "Я") - PullRequest
5 голосов
/ 23 апреля 2009

У меня проблемы с нашей базой данных MSSQL, настроенной на любое из турецких сопоставлений. Из-за проблемы "Turkish I" ни один из наших запросов, содержащих в себе 'i', не работает правильно. Например, если у нас есть таблица с именем «Unit» с определенным в этом случае столбцом «UnitID», запрос «выбрать unitid from unit» больше не работает, поскольку строчные буквы «i» в «id» отличаются от определенного заглавного Я в "UnitID". В сообщении об ошибке будет указано «Неверное имя столбца« unitid ».

Я знаю, что это происходит потому, что на турецком языке буква i и я рассматриваются как разные буквы. Тем не менее, я не уверен, как решить эту проблему? Невозможно просмотреть все 1900 SP в БД и исправить регистр "i".

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

Ответы [ 7 ]

5 голосов
/ 27 апреля 2009

Оказывается, что лучшим решением было бы на самом деле рефакторинг всего SQL и кода.

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

select unitid from dbo.unit 

будет изменено на

select UnitId from dbo.Unit

Приложение также проходит через код и заменяет любые вхождения хранимого процесса и его параметров и корректирует их в соответствии с регистром, определенным в БД. Для всех таблиц данных в приложении задана инвариантная локаль (спасибо FXCop за указание всех таблиц данных ...), это предотвращает чувствительность к регистру вызовов внутри кода.

Если кому-то понадобится приложение или какой-либо совет по процессу, вы можете связаться со мной по адресу dotnetvixen@gmail.com.

0 голосов
/ 05 октября 2012

Изменение региональных настроек вашего устройства на английский (США) полностью спасает день!

0 голосов
/ 23 апреля 2009

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

Рекомендуется изменить настройки базы данных на UTF-8, и все. Это должно решить все проблемы.

Вы можете столкнуться с проблемами, если хотите поддерживать чувствительность к регистру в (ı-I, i-İ), что может быть проблематично для поддержки в SQL Server. Если весь вход из Интернета, убедитесь, что это UTF-8.

Если вы сохраните настройки входа UTF-8 в Web и настройки SQL Server как UTF-8, все должно пройти гладко.

0 голосов
/ 23 апреля 2009

Я понимаю, что вы не хотите проходить через все хранимые процедуры, чтобы исправить проблему, но, возможно, вы будете в порядке, чтобы использовать инструмент рефакторинга для решения проблемы. Я говорю, посмотрите на SQL Refactor . Я не использовал его, но выглядит многообещающе.

0 голосов
/ 23 апреля 2009

Можете ли вы изменить параметры сортировки базы данных по умолчанию: при этом все ваши текстовые столбцы останутся с турецкой сортировкой?

Запросы будут работать, но данные будут работать правильно. В теории ...

Есть некоторые ошибки с временными таблицами и переменными таблиц с столбцами varchar: вам нужно будет добавить предложения COLLATE к этим

0 голосов
/ 23 апреля 2009

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

0 голосов
/ 23 апреля 2009

Возможно, я не понимаю проблемы здесь, но разве это не более вероятно, потому что база данных чувствительна к регистру, а ваш запрос - нет? Например, на Sybase я могу сделать следующее:

USE master
GO
EXEC sp_server_info 16
GO

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

attribute_id   attribute_name     attribute_value 
          16   IDENTIFIER_CASE    MIXED
...