Что такое кодировка (collation)?sql-68

Collation (сопоставление) — это набор правил, определяющих способ сравнения, сортировки и представления строковых данных в SQL Server. Это комплексный параметр, который влияет на обработку текстовой информации.

Основные компоненты collation

  1. Кодовая страница - определяет набор символов
  2. Правила сортировки - как сравниваются символы
  3. Чувствительность - к регистру, акцентам и другим особенностям

Структура имени collation в SQL Server

-- Пример: SQL_Latin1_General_CP1_CI_AS
--
-- SQL_         - префикс (SQL Server)
-- Latin1_General - языковые правила (латиница)
-- CP1          - кодовая страница (1252)
-- CI           - Case Insensitive (нечувствительность к регистру)
-- AS           - Accent Sensitive (чувствительность к акцентам)

Основные типы collation

1. Windows Collation

-- Использует правила Windows
-- Пример: Latin1_General_CI_AS
  • Особенности:
    • Следует стандарту Windows
    • Поддерживает Юникод
    • Более современный подход

2. SQL Server Collation

-- Унаследованные правила SQL Server
-- Пример: SQL_Latin1_General_CP1_CI_AS
  • Особенности:
    • Совместимость с старыми версиями
    • Менее точная сортировка
    • Быстрее для некоторых операций

Ключевые параметры чувствительности

СуффиксЗначениеПример
_CICase Insensitive (регистр)A = a
_CSCase Sensitive (регистр)A ≠ a
_AIAccent Insensitive (акценты)é = e
_ASAccent Sensitive (акценты)é ≠ e
_KSKana Sensitive (японская кана)カ ≠ ガ
_WSWidth Sensitive (ширина символов)ア ≠ ア

Важные системные представления для работы с collation

-- Все доступные collation
SELECT * FROM sys.fn_helpcollations();

-- Текущие настройки
SELECT SERVERPROPERTY('Collation') AS ServerCollation;
SELECT DATABASEPROPERTYEX('DBName', 'Collation') AS DBCollation;

Практические примеры

1. Создание базы данных с определенным collation

CREATE DATABASE RussianDB
COLLATE Cyrillic_General_CI_AS;

2. Изменение collation для столбца

ALTER TABLE Customers
ALTER COLUMN LastName NVARCHAR(50)
COLLATE Cyrillic_General_CS_AS;

3. Временное изменение collation в запросе

SELECT Name
FROM Products
WHERE Name COLLATE Latin1_General_CS_AS = 'Chaos';

Проблемы и решения

  1. Конфликты collation:
-- Ошибка: Cannot resolve the collation conflict
SELECT * FROM TableA A
JOIN TableB B ON A.Name = B.Name -- Разные collation

Решение:

SELECT * FROM TableA A
JOIN TableB B ON A.Name COLLATE DATABASE_DEFAULT = B.Name COLLATE DATABASE_DEFAULT
  1. Сравнение строк с разными collation:
  • Всегда приводите к одному collation перед сравнением
  1. Производительность:
  • Использование COLLATE в WHERE может блокировать использование индексов

Рекомендации по выбору collation

  1. Для русского языка:

    • Cyrillic_General_CI_AS - стандартный выбор
    • Cyrillic_General_CS_AS - если нужна чувствительность к регистру
  2. Для мультиязычных систем:

    • Latin1_General_CI_AS - базовый вариант
    • SQL_Latin1_General_CP1_CI_AS - для совместимости
  3. Для веб-приложений:

    • UTF-8 (доступно с SQL Server 2019)
    CREATE DATABASE WebApp COLLATE Latin1_General_100_CI_AS_SC_UTF8;
    

Резюмируем

Collation в SQL Server:

  1. Определяет правила сравнения и сортировки строк
  2. Влияет на поведение LIKE, ORDER BY, сравнений
  3. Может быть задан на уровне сервера, БД, таблицы, столбца
  4. Важно выбирать осознанно при проектировании БД
  5. Конфликты collation - частая проблема в распределенных системах

Правильный выбор collation обеспечивает:

  • Корректную сортировку данных
  • Ожидаемое поведение сравнений
  • Поддержку нужных языков
  • Совместимость между системами