Мы переходим от SQL 2005 [экземпляр и БД имеют параметры сортировки SQL_Latin1_General_CP1_CI_AS
] к SQL 2008 [по умолчанию Latin1_General_CI_AS
].
Я завершил установку SQL 2008 R2 и использовал параметры Latin1_General_CI_AS
сортировки по умолчанию , при этом восстановление базы данных все еще включено SQL_Latin1_General_CP1_CI_AS
. Возникли исключительные проблемы - таблицы #temp, в Latin1_General_CI_AS
которых находилась БД, SQL_Latin1_General_CP1_CI_AS
и именно там я сейчас нахожусь - мне нужен совет по поводу ловушек, пожалуйста.
На установке SQL 2008 R2, у меня есть возможность по установке для использования , 'SQL Collation, used for backwards compatibility'
где у меня есть возможность выбрать один и тот же порядок сопоставления в качестве базы данных 2005: SQL_Latin1_General_CP1_CI_AS
.
Это позволит мне не иметь проблем с таблицами #temp, но есть ли подводные камни?
Потеряю ли я какую-либо функциональность или какие-либо функции, не используя «текущую» сортировку SQL 2008?
- Как насчет того, когда мы перейдем (например, через 2 года) с 2008 на SQL 2012? Будут ли у меня проблемы тогда?
Буду ли я в какой-то момент вынужден идти
Latin1_General_CI_AS
?Я прочитал, что некоторые сценарии DBA завершают строки полных баз данных, а затем запускают сценарий вставки в базу данных с новым сопоставлением - я очень напуган и опасаюсь этого - вы бы порекомендовали это сделать?
источник
Ответы:
Прежде всего, извиняюсь за такой длинный ответ, так как я чувствую, что все еще существует большая путаница, когда люди говорят о таких терминах, как сортировка, порядок сортировки, кодовая страница и т. Д.
От BOL :
Это означает, что сортировка очень важна, так как она определяет правила сортировки и сравнения символьных строк данных.
Примечание: больше информации о COLLATIONPROPERTY
Теперь давайте сначала понять различия ......
Запуск ниже T-SQL:
Результаты будут:
Глядя на приведенные выше результаты, единственное различие заключается в порядке сортировки между двумя параметрами сортировки. Но это не так, и вы можете понять, почему, как показано ниже:
Тест 1:
Результаты теста 1:
Из приведенных выше результатов видно, что мы не можем напрямую сравнивать значения в столбцах с разными параметрами сортировки, вы должны использовать их
COLLATE
для сравнения значений столбцов.ТЕСТ 2:
Основное различие заключается в производительности, как указывает Эрланд Соммарског в этом обсуждении MSDN .
--- Создать индексы на обеих таблицах
--- Запустить запросы
--- Это будет иметь НЕЗАКОННОЕ преобразование
--- Запустить запросы
--- Это НЕ будет иметь НЕПРАВИЛЬНОЕ преобразование
Причина неявного преобразования заключается в том, что у меня есть сопоставление базы данных и сервера как
SQL_Latin1_General_CP1_CI_AS
и в таблице Table_Latin1_General_CI_AS есть столбец Комментарии, определенный какVARCHAR(50)
с COLLATE Latin1_General_CI_AS , поэтому во время поиска SQL Server должен выполнить преобразование IMPLICIT.Тест 3:
С такой же настройкой, теперь мы сравним столбцы varchar со значениями nvarchar, чтобы увидеть изменения в планах выполнения.
- выполнить запрос
- выполнить запрос
Обратите внимание, что первый запрос может выполнять поиск по индексу, но должен выполнять неявное преобразование, тогда как второй выполняет сканирование индекса, которое оказывается неэффективным с точки зрения производительности, когда он сканирует большие таблицы.
Вывод :
SQL_Latin1_General_CP1_CI_AS
это SQL сортировка с правилами, которые позволяют сортировать данные для Unicode и Non-Unicode отличаются.Latin1_General_CI_AS
это сопоставление Windows с правилами, которые позволяют сортировать данные для Unicode и Non-Unicode одинаковы.Смотрите мой ответ выше.
Все зависит от того, какие функции / функции вы имеете в виду. Сортировка - это хранение и сортировка данных.
Не могу ручаться! Поскольку все может измениться, и всегда хорошо быть в соответствии с предложением Microsoft +, вам необходимо понимать свои данные и подводные камни, о которых я упоминал выше. Также обращайтесь к этому и этому пункту.
Если вы хотите изменить параметры сортировки, тогда такие сценарии полезны. Я обнаружил, что много раз меняю параметры сортировки баз данных, чтобы они соответствовали параметрам сортировки серверов, и у меня есть несколько сценариев, которые делают это довольно аккуратно. Дайте мне знать, если вам это нужно.
Ссылки :
источник
В дополнение к тому, что @Kin подробно изложил в своем ответе , есть еще несколько вещей, о которых следует помнить при переключении параметров сортировки по умолчанию сервера (т.е. экземпляра) (элементы над горизонтальной линией имеют прямое отношение к двум параметрам сортировки, упомянутым в Вопросе; элементы ниже горизонтальной линии имеют отношение к общему):
ЕСЛИ КОЛЛЕКЦИЯ ПО УМОЛЧАНИЮ ВАШЕЙ БАЗЫ ДАННЫХ НЕ ИЗМЕНЯЕТСЯ, то проблема производительности «неявного преобразования», описанная в ответе @ Kin, не должна быть проблемой, поскольку строковые литералы и локальные переменные используют сопоставление по умолчанию для базы данных, а не для сервера. Единственное влияние для сценария, в котором уровень сортировки уровня экземпляра изменяется, но не сортировка уровня базы данных, (оба подробно описаны ниже):
Одно из различий между этими двумя параметрами сортировки заключается в том, как они сортируют определенные символы для
VARCHAR
данных (это не влияет наNVARCHAR
данные). Для не-EBCDICSQL_
сортировок используется то, что называется «сортировка строк» дляVARCHAR
данных , а для всех других сопоставлений и дажеNVARCHAR
данных для сопоставлений без EBCDICSQL_
используется так называемая «сортировка слов». Разница в том, что в «Сортировке слов» тире-
и апострофу'
(и, может быть, нескольким другим символам?) Дан очень низкий вес, и они по существу игнорируются, если в строках нет других отличий. Чтобы увидеть это поведение в действии, выполните следующее:Возвращает:
и:
Хотя вы «потеряете» поведение «сортировки строк», я не уверен, что назвал бы это «функцией». Это поведение, которое было сочтено нежелательным (о чем свидетельствует тот факт, что оно не было перенесено ни в одно из сопоставлений Windows). Тем не менее, это определенная разница в поведении между двумя (опять сортировки, только для не-EBCDIC
VARCHAR
данных), и вы можете иметь код и / или клиента ожидания , основанные на «Струнный Sort» поведение. Это требует тестирования вашего кода и, возможно, исследования, чтобы увидеть, может ли это изменение поведения оказать какое-либо негативное влияние на пользователей.Еще одно различие между
SQL_Latin1_General_CP1_CI_AS
иLatin1_General_100_CI_AS
заключается в возможности делать расширения дляVARCHAR
данных (NVARCHAR
данные уже могут делать это для большинстваSQL_
сопоставлений), например, обрабатывать,æ
как если бы это былоae
:Возвращает:
Единственное, что вы «теряете» здесь - это невозможность выполнить эти расширения. Вообще говоря, это еще одно преимущество перехода на Windows Collation. Однако, как и при перемещении «Сортировка строк» в «Сортировка слов», применяется то же предостережение: это определенная разница в поведении между двумя параметрами сортировки (опять же, только для
VARCHAR
данных), и у вас может быть код и / или клиент ожидания основаны не на этих отображений. Это требует тестирования вашего кода и, возможно, исследования, чтобы увидеть, может ли это изменение поведения оказать какое-либо негативное влияние на пользователей.(впервые отмечено в этом SO-ответе @Zarepheth: может ли SQL Server SQL_Latin1_General_CP1_CI_AS безопасно конвертироваться в Latin1_General_CI_AS? )
Сортировка на уровне сервера используется для установки параметров сортировки баз данных системы, в том числе
[model]
. База[model]
данных используется в качестве шаблона для создания новых баз данных, который включает[tempdb]
при каждом запуске сервера. Но даже с изменением параметров сортировки на уровне сервера, изменяющих параметры сортировки[tempdb]
, существует несколько простой способ исправить различия параметров сортировки между базами данных, которые являются «текущими» приCREATE #TempTable
выполнении и[tempdb]
. При создании временных таблиц объявите параметры сортировки, используяCOLLATE
предложение, и укажите параметры сортировкиDATABASE_DEFAULT
:Лучше всего использовать самую последнюю версию желаемой сортировки, если доступно несколько версий. Начиная с SQL Server 2005, была представлена серия параметров сортировки «90», а в SQL Server 2008 была представлена серия параметров сортировки «100». Вы можете найти эти сопоставления, используя следующие запросы:
Поскольку вы находитесь на SQL Server 2008 R2, вы должны использовать
Latin1_General_100_CI_AS
вместоLatin1_General_CI_AS
.Разница между чувствительными к регистру версиями этих конкретных параметров сортировки (т. Е.
SQL_Latin1_General_CP1_CS_AS
ИLatin1_General_100_CS_AS
) заключается в порядке букв верхнего и нижнего регистра при выполнении сортировки с учетом регистра. Это также влияет на диапазоны односимвольных классов (то есть[start-end]
), которые могут использоваться сLIKE
оператором иPATINDEX
функцией. Следующие три запроса показывают этот эффект как для сортировки, так и для диапазона символов:Единственный способ выполнить сортировку в верхнем регистре перед строчными (для одной и той же буквы) - это использовать один из 31 параметров сортировки, который поддерживает такое поведение, а именно: параметры
Hungarian_Technical_*
сортировки и несколько параметровSQL_
сортировки (которые поддерживают это поведение только дляVARCHAR
данных. ).Менее важно для этого конкретного изменения, но все же полезно знать об этом, так как это повлияет, если изменение сервера на двоичную или чувствительную к регистру сортировку, заключается в том, что сортировка на уровне сервера также влияет на:
sysname
типа данныхЭто означает, что если вы или «недавно ушедший программист», который, по-видимому, ответственен за весь плохой код ;-), не были внимательны к регистру и объявили переменную как,
@SomethingID
а затем обратились к ней как к@somethingId
позже, это сломалось бы при переходе к делу -чувствительный или бинарный подбор. Точно так же код, который используетsysname
тип данных, но ссылается на него какSYSNAME
,SysName
или что-то, отличное от всех строчных букв, также будет поврежден при перемещении в экземпляр с использованием чувствительного к регистру или двоичного сопоставления.источник