Выбор SQL Server Collation - PullRequest
14 голосов
/ 31 мая 2011

Этим вечером я потратил много времени, пытаясь найти руководство по выбору параметров сортировки, которые следует применять в моей установке SQL Server 2008 R2, но почти все в Интернете в основном говорит: «выберите то, что подходит именно вам». Чрезвычайно бесполезно.

Мой контекст - разработка новых приложений.Я не беспокоюсь об обратной совместимости с предыдущей версией SQL Server (а именно <= 2005).Я очень заинтересован в хранении данных, представляющих языки со всего мира, а не только на латинице.То, что очень мало помощи я нашел в Интернете, говорит о том, что мне следует избегать всех сопоставлений «SQL_».Это сужает мой выбор использования двоичного или «не двоичного» сопоставления на основе языкового стандарта Windows. </p>

Если я использую двоичный файл, я понимаю, что должен использовать «BIN2».Так что это мой вопрос.Как определить, должен ли я использовать BIN2 или просто "Latin1_General_100_XX_XX_XX"?Мое чувство паука говорит мне, что BIN2 обеспечит сопоставление, которое «менее точно», но более универсально для всех языков (и быстро!).Я также подозреваю, что двоичная сортировка чувствительна к регистру, чувствительна к акценту и кана (да?).Напротив, я подозреваю, что недвоичная сортировка лучше всего подойдет для латинских языков.

Документация не поддерживает мои утверждения выше, я делаю обоснованные предположения.Но это проблема!Почему онлайн-документация настолько тонка, что выбор остается угадывать?Даже в книге «Внутренние компоненты SQL Server 2008» обсуждалось множество вариантов, без объяснения того, почему и когда будет выбрано двоичное сопоставление (по сравнению с сопоставлением небинарных окон).Criminy !!!

Ответы [ 4 ]

3 голосов
/ 03 октября 2011

"Внутренние компоненты SQL Server 2008" хорошо обсуждают тему imho.

Двоичное сопоставление сложно, если вы намерены поддерживать текстовый поиск людей, лучше использовать недвоичный. Двоичный код хорош для небольшого увеличения производительности, если вы настроили все остальное (сначала архитектура) и в тех случаях, когда чувствительность к регистру и акцент чувствительны, например, хэши паролей. Двоичное сопоставление на самом деле является «более точным» в том смысле, что оно не учитывает похожие тексты. Хотя порядок сортировки, который вы получаете, хорош только для машин.

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

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

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

Одна важная вещь состоит в том, чтобы параметры сортировки сервера совпадали с параметрами сортировки базы данных. Это сделает вашу жизнь намного проще, если вы планируете использовать временные таблицы в качестве временных таблиц, если они созданы с помощью «CREATE TABLE #ttt ...», подбирают параметры сортировки сервера, и вы столкнетесь с конфликтами параметров сортировки, которые вам нужно будет решить с помощью указание явного сопоставления. Это также влияет на производительность.

2 голосов
/ 03 октября 2011

Пожалуйста, не считайте мой ответ полным, но вы должны принять во внимание следующие моменты:

  • (как сказал #Anthony) Все текстовые поля должны использовать nvarchar тип данных.Это позволит вам сохранить любой символ из любого языка, как определено UTF-8\unicode набором символов!Если вы этого не сделаете, вы не сможете смешивать тексты из разных источников (латинского, кириллического, арабского и т. Д.) В своих таблицах.

При этом выбор параметров сортировки будет в основном влиять наследующее:

  • Последовательность упорядочения или правила сортировки, которые должны быть установлены между символами, такими как 'e' и 'é', или 'c' и 'ç' (если они считаются равными или нет?).В некоторых случаях упорядочивающие последовательности учитывают конкретные буквенные комбинации, как в венгерском, где C и CS, или D, DZ и DZS, считаются независимыми.
  • Пробелы (или другие небуквенные символы)проанализировано: какой из них является правильным «алфавитным» порядком?

этот (пробелы рассматриваются как символы «первого ранга»)?

San Juan
San Teodoro
Santa Barbara

или этот (пробелыне учитывается при заказе)?

San Juan
Santa Barbara
San Teodoro
  • Сопоставление также влияет на чувствительность к регистру: должны ли заглавные буквы считаться похожими на строчные?
1 голос
/ 14 июня 2011

Наилучшее сопоставление по умолчанию для глобальной базы данных (например, веб-сайта), вероятно, составляет Latin1_General_CI_AS. Более важным, чем сопоставление, является проверка того, что все текстовые столбцы используют тип данных nvarchar.

0 голосов
/ 11 декабря 2013

Пока вы используете столбцы NVARCHAR (как и для смешанных международных данных), все сопоставления * _BIN и * _BIN2 выполняют одинаковое двоичное сравнение / сортировку на основе кодовых точек Unicode. Неважно, какой вы выберете. Latin1_General_BIN2 выглядит разумным универсальным выбором.

Источник: http://msdn.microsoft.com/en-us/library/ms143350(v=sql.105).aspx

...