
Collation в SQL Server определяет правила сортировки и сравнения строк, включая чувствительность к регистру и акцентам. От выбранных параметров зависит корректность обработки текстовых данных, особенно при работе с многоязычными базами или интеграции нескольких систем.
Изменение collation может потребоваться при объединении баз данных с разными настройками, миграции на другой сервер или устранении ошибок при сравнении строк. На уровне сервера используется значение, заданное при установке, но для отдельных баз, таблиц или столбцов можно указать собственные правила.
Важно учитывать, что смена collation затрагивает структуру данных. Например, пересоздание индексов становится обязательным, а несоответствие настроек между таблицами может привести к ошибкам при соединении данных. Поэтому перед изменением рекомендуется проверить текущие значения с помощью функции DATABASEPROPERTYEX или системных представлений, а затем определить, нужно ли менять настройки только для базы, либо для конкретных столбцов.
В дальнейших разделах будут рассмотрены методы изменения collation на разных уровнях: серверном, уровне базы данных и отдельных полей, а также приведены рекомендации по минимизации рисков при подобных изменениях.
Проверка текущего collation базы данных

Чтобы узнать collation конкретной базы данных, используйте запрос:
SELECT name, collation_name
FROM sys.databases
WHERE name = 'ИмяБазы';
Для текущей базы данных:
SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS Collation;
Дополнительные способы проверки:
- Через SQL Server Management Studio (SSMS): в Object Explorer открыть свойства базы и на вкладке Options найти параметр Collation.
- Для конкретной таблицы и её столбцов:
SELECT name, collation_name
FROM sys.columns
WHERE object_id = OBJECT_ID('ИмяТаблицы');
Проверка collation важна при переносе данных между серверами или объединении таблиц с разными настройками сортировки.
Определение collation на уровне сервера
Collation сервера задаётся при установке SQL Server и определяет правила сортировки и сравнения строковых данных по умолчанию. Этот параметр хранится в master-базе и применяется ко всем вновь создаваемым базам данных, если при их создании не указано иное.
Текущую конфигурацию можно проверить с помощью запроса:
SELECT SERVERPROPERTY('Collation') AS ServerCollation;
Основные аспекты collation на уровне сервера:
- Определяет регистрозависимость (CS или CI).
- Задаёт учёт или игнорирование диакритических знаков (AS или AI).
- Выбирает кодировку и правила сортировки для языковой локали (например, Cyrillic_General, Latin1_General).
Если требуется изменить collation сервера, необходимо пересоздать системные базы данных с новым параметром. Процедура включает:
- Полное резервное копирование пользовательских баз.
- Запуск установки SQL Server в режиме пересоздания системных баз с указанием нового collation.
- Восстановление пользовательских баз данных.
Изменение collation без пересоздания системных баз невозможно, поэтому планирование этого параметра на этапе установки критично.
Изменение collation при создании новой базы
При создании базы данных в SQL Server collation задаётся параметром COLLATE. Если его не указать, используется значение по умолчанию, определённое на уровне сервера. Для точного контроля необходимо явно указывать нужное правило сортировки.
Пример создания базы с collation:
CREATE DATABASE TestDB COLLATE Cyrillic_General_CI_AS;
Здесь Cyrillic_General_CI_AS означает кириллическую кодировку с нечувствительностью к регистру и акцентам. Указание collation на этапе создания гарантирует единый набор правил сортировки для всех объектов, которые будут наследовать это свойство.
Если предполагается работа с несколькими языками, рекомендуется выбирать универсальные варианты, например SQL_Latin1_General_CP1251_CI_AS для кириллицы или Latin1_General_CI_AS для смешанных данных. При этом следует учитывать совместимость с клиентскими приложениями и уже существующими базами.
После создания базы изменить её collation проблематично, так как потребуется пересоздание объектов и конвертация данных. Поэтому параметр нужно определять заранее на этапе проектирования.
Смена collation существующей базы данных
Изменение collation базы данных в SQL Server выполняется командой ALTER DATABASE. Однако простая смена параметра не приводит к автоматическому обновлению collation у уже созданных таблиц и столбцов. Это означает, что после изменения базы данные объекты сохранят старые настройки.
Пример изменения collation базы данных:
ALTER DATABASE [ИмяБД] COLLATE Cyrillic_General_CI_AS;
После выполнения команды новые объекты будут создаваться с указанным collation. Для изменения существующих таблиц и столбцов требуется явное применение ALTER TABLE или пересоздание объектов. Например:
ALTER TABLE [Таблица] ALTER COLUMN [Столбец] NVARCHAR(100) COLLATE Cyrillic_General_CI_AS NOT NULL;
При наличии ограничений и индексов их нужно временно удалить, изменить collation у столбца и затем создать заново. Если количество объектов велико, обычно используют скрипты, которые генерируют команды изменения для всех строковых столбцов.
Важно учитывать совместимость collation при объединении данных из разных баз. Несовпадение приводит к ошибкам на этапе выполнения запросов с объединением или сравнением строк.
Перевод таблицы на другой collation
Изменить collation для всей таблицы напрямую невозможно, поэтому требуется поочерёдная переработка столбцов символьных типов данных. Для начала нужно определить текущие настройки:
SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('ИмяТаблицы');
Чтобы заменить collation у конкретного столбца:
ALTER TABLE ИмяТаблицы ALTER COLUMN ИмяСтолбца NVARCHAR(100) COLLATE Cyrillic_General_CI_AS NOT NULL;
При работе с PK, FK или индексами столбцы придётся временно освободить от ограничений. Пример последовательности:
ALTER TABLE ИмяТаблицы DROP CONSTRAINT FK_Имя;
ALTER INDEX IX_Имя ON ИмяТаблицы DISABLE;
ALTER TABLE ИмяТаблицы ALTER COLUMN ИмяСтолбца NVARCHAR(100) COLLATE Cyrillic_General_CI_AS;
ALTER INDEX IX_Имя ON ИмяТаблицы REBUILD;
ALTER TABLE ИмяТаблицы ADD CONSTRAINT FK_Имя FOREIGN KEY (ИмяСтолбца) REFERENCES ДругаяТаблица(Ключ);
Для нескольких столбцов процесс повторяется, поэтому часто применяют генерацию динамических скриптов через sys.columns и sys.foreign_keys. Такой подход позволяет автоматизировать массовую смену collation и сократить ручные действия.
Изменение collation для отдельного столбца

Для изменения collation конкретного столбца используется команда ALTER TABLE с модификацией типа данных через ALTER COLUMN. Например, чтобы изменить collation столбца LastName таблицы Employees на SQL_Latin1_General_CP1_CI_AS, выполняется:
ALTER TABLE Employees ALTER COLUMN LastName NVARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS;
Важно учитывать, что столбец не должен быть частью индексируемого ключа или внешнего ограничения. Если это так, сначала необходимо удалить индекс или ограничение, затем изменить collation, после чего восстановить индекс или ограничение.
При изменении collation столбца с уже существующими данными SQL Server пересчитывает внутреннее представление текста, что может занять значительное время на больших таблицах. Для минимизации простоя рекомендуется выполнить изменение в период низкой нагрузки и создать резервную копию таблицы.
Если столбец участвует в join или сравнениях с другими столбцами, важно убедиться, что collation совпадает с другими столбцами или использовать явное приведение через COLLATE в запросах, чтобы избежать ошибок несовпадения collation.
Для проверки текущего collation столбца применяется запрос:
SELECT COLUMN_NAME, COLLATION_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Employees' AND COLUMN_NAME = 'LastName';
Изменение collation на уровне столбца позволяет выбирать точную сортировку и чувствительность к регистру без изменения всей базы данных. Это эффективно для столбцов с текстом на нескольких языках или при необходимости строгого контроля сортировки в отдельных полях.
Работа с collation в строковых выражениях и запросах
В SQL Server collation определяет правила сравнения и сортировки строк. При работе с текстовыми данными collation можно указывать прямо в запросах, что позволяет избежать ошибок при сравнении столбцов с разными настройками.
Для явного задания collation в запросе используется ключевое слово COLLATE. Например:
SELECT * FROM Users WHERE FirstName COLLATE Latin1_General_CI_AS = 'Алексей';
Здесь строка в столбце FirstName сравнивается с заданной строкой с использованием определённого collation, игнорируя глобальные настройки базы.
Collation также применяется при объединении столбцов в выражениях:
SELECT FirstName + ' ' + LastName COLLATE Cyrillic_General_CI_AS AS FullName FROM Users;
Если два столбца с разными collation используются в JOIN или WHERE, SQL Server выдаст ошибку без явного согласования collation. Решение:
SELECT * FROM TableA a JOIN TableB b ON a.Name COLLATE SQL_Latin1_General_CP1_CI_AS = b.Name COLLATE SQL_Latin1_General_CP1_CI_AS;
Collation можно использовать для сортировки независимо от настроек столбца:
SELECT Name FROM Users ORDER BY Name COLLATE Cyrillic_General_CS_AS;
| Сценарий | Пример |
|---|---|
| Сравнение строк с разным collation | WHERE Column1 COLLATE Latin1_General_CI_AS = Column2 COLLATE Latin1_General_CI_AS |
| Объединение строк с разным collation | Column1 + Column2 COLLATE Cyrillic_General_CI_AS |
| Сортировка по определённому collation | ORDER BY Column COLLATE Cyrillic_General_CS_AS |
| Использование в функций | LEN(Column COLLATE Latin1_General_CI_AS) |
Использование COLLATE в запросах снижает риск ошибок при миграции данных между базами с разными настройками и обеспечивает корректное сравнение строк в многоязычных проектах.
Решение конфликтов collation при объединении данных

Конфликты collation возникают при сравнении или объединении столбцов с разными правилами сортировки. SQL Server генерирует ошибку Cannot resolve the collation conflict between "Collation1" and "Collation2". Решение требует явного указания collation через COLLATE.
Для JOIN следует привести столбцы к общему collation:
SELECT a.Column1, b.Column1 FROM TableA a INNER JOIN TableB b ON a.Column1 COLLATE Latin1_General_CI_AS = b.Column1 COLLATE Latin1_General_CI_AS
Для объединений UNION или UNION ALL все текстовые столбцы должны иметь одинаковый collation:
SELECT Column1 COLLATE Latin1_General_CI_AS FROM TableA
UNION
SELECT Column1 COLLATE Latin1_General_CI_AS FROM TableB
Если изменение collation в исходных таблицах невозможно, можно создать вычисляемый столбец с нужным collation и использовать его в объединениях:
ALTER TABLE TableA ADD Column1_Std AS (Column1 COLLATE Latin1_General_CI_AS)
Приведение collation в запросах не изменяет данные, но влияет на сравнение строк и сортировку. Для системной унификации рекомендуется установить одинаковый collation при создании базы данных и таблиц.
Вопрос-ответ:
Что такое collation в SQL Server и почему его может понадобиться изменить?
Collation в SQL Server определяет правила сортировки и сравнения текстовых данных, включая регистр букв и национальные символы. Его может понадобиться изменить, если база данных была создана с неправильной кодировкой, или если нужно объединить данные из разных источников с разными collation. Некорректные настройки могут приводить к ошибкам при объединении таблиц и некорректной сортировке строк.
Можно ли изменить collation для всей базы данных без потери данных?
Да, collation базы данных можно изменить с помощью команды ALTER DATABASE, но это не меняет collation уже существующих таблиц и столбцов. Чтобы полностью привести таблицы и столбцы к новому collation, потребуется отдельно изменить collation для каждого текстового столбца. Перед этим рекомендуется создать резервную копию, так как изменение collation может повлиять на индексы и внешние ключи.
Как изменить collation конкретного столбца в таблице?
Для изменения collation отдельного столбца используется команда ALTER TABLE с модификацией столбца. Например, для столбца типа VARCHAR можно написать: ALTER TABLE ИмяТаблицы ALTER COLUMN ИмяСтолбца VARCHAR(50) COLLATE НовыйCollation. Если столбец участвует в индексах или внешних ключах, их может потребоваться удалить перед изменением collation и создать заново после.
Что делать, если после изменения collation появляются ошибки при объединении таблиц?
Чаще всего такие ошибки связаны с несовпадением collation между столбцами разных таблиц. Решается это с помощью явного указания COLLATE в SQL-запросе для конкретного столбца, например: SELECT * FROM Таблица1 t1 JOIN Таблица2 t2 ON t1.Столбец COLLATE НовыйCollation = t2.Столбец. Это позволяет временно согласовать сравнение данных без изменения структуры таблиц.
Изменение collation влияет на индексированные столбцы?
Да, изменение collation на индексированном столбце требует удаления существующего индекса и его пересоздания после смены collation. Без этого SQL Server не позволит выполнить операцию, так как индексы зависят от правил сортировки и сравнения строк. Планируя изменение collation, нужно учитывать необходимость обновления всех зависимых индексов и ключей.
Можно ли изменить collation для существующей базы данных в SQL Server без потери данных?
Да, изменить collation для существующей базы данных возможно, но нужно быть осторожным. Сначала следует изменить collation самой базы данных с помощью команды ALTER DATABASE [ИмяБазы] COLLATE Новый_Collation. Однако это не изменяет collation уже существующих таблиц и колонок. Чтобы изменить collation колонок, придётся использовать команду ALTER TABLE [ИмяТаблицы] ALTER COLUMN [ИмяКолонки] VARCHAR(100) COLLATE Новый_Collation. Перед изменением рекомендуется сделать резервную копию, так как операция может вызвать ошибки при несовпадении данных с новым collation или при наличии индексов и внешних ключей.
