2009-04-23 1 views
4

У меня проблемы с нашей базой данных MSSQL, установленной в любой из турецких коллайсов. Безусловно, проблема «Турецкий я», ни один из наших запросов, содержащих «i» в них, работает правильно. Например, если у нас есть таблица под названием «Unit» с указанным в этом случае столбцом «UnitID», запрос «select unitid from unit» больше не работает, потому что нижний регистр «i» в «id» отличается от заданного капитала Я в «UnitID». В сообщении об ошибке будет указано «Недопустимое имя столбца« unitid ».»Проблемы с турецким SQL Collation (турецкий «I»)

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

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

+0

Можете ли вы опубликовать ссылку на страницу с описанием проблемы «turkish i»? – Tomalak

+1

@Tomalak, посмотрите эту страницу: http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

+0

Я знаю эту страницу. Но я не уверен, что вы поступаете правильно. «Тест Турции» посвящен анализу данных, но описание проблемы похоже на то, что вы используете турецкий язык i в тексте SQL-запроса, чего вы не должны делать в любом случае. – Tomalak

ответ

4

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

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

select unitid from dbo.unit 

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

select UnitId from dbo.Unit 

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

Если кому-либо понравится приложение или какой-либо совет по процессу, вы можете связаться со мной по адресу [email protected]

+0

... но ваше поле «UnitID» (с капиталом «D») – nickgrim

0

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

USE master 
GO 
EXEC sp_server_info 16 
GO 

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

attribute_id attribute_name  attribute_value 
      16 IDENTIFIER_CASE MIXED 
+0

Спасибо за комментарий. Я установил его нечувствительным к регистру, но, к сожалению, на турецком языке маленький я и большой, я на самом деле вообще воспринимаюсь как разные персонажи, поэтому это не вопрос об корпусе! Большое спасибо – Madeleine

0

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

0

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

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

Есть несколько подводных камней с временными таблицами и табличными переменными с VARCHAR столбцами: вы должны добавить СОРТ- положения в этих

+0

К сожалению, для всех наших столбцов varchar установлено значение database_default, поэтому, если сортировка изменена на обычную латинскую опцию, то столбцы varchar будут использовать латинский язык. Я попробую запустить скрипт, чтобы установить сортировку на турецкие языки на всех столбцах varchar и установить сортировку db на латинский язык и посмотреть, что произойдет! Это хорошая идея, хотя и не очень общая, так как в идеале мы бы хотели, чтобы БД работала на любом нечувствительном к регистру сопоставлении! Спасибо за ответ – Madeleine

+0

Изменение сортировки базы данных (ALTER DATABASE) должно оставить все текстовые столбцы такими, какие они есть. Это влияет только на системные таблицы, а по умолчанию – gbn

+0

попробовал и делает трюк. Отредактируйте скрипт, чтобы обновить все сопоставления столбцов до turkish, затем установите сортировку базы данных в обычную латинскую сортировку, и все работает. Закончился рефакторинг кода, который можно увидеть в моем ответе, поскольку это решение не очень удобно. Но определенно работает в краткосрочной перспективе. Спасибо – Madeleine

0

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

+0

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

0

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

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

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

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

0

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

Смежные вопросы