Как в SQL Server 2017 писать на русском

В SQL Server 2017 русский текст обычно ломается по двум причинам: колонка создана не под Unicode или строка вставляется без префикса N. В результате вместо нормального текста можно увидеть вопросительные знаки, кракозябры или неправильную сортировку

Правильная базовая схема такая: для русского текста используйте nvarchar, а перед русской строкой в запросе ставьте N

Быстрый ответ

Так хранить русский текст безопаснее:

CREATE TABLE lessons (
    id INT IDENTITY PRIMARY KEY,
    title NVARCHAR(200),
    description NVARCHAR(MAX)
);

INSERT INTO lessons (title, description)
VALUES (N'Первый урок SQL', N'Учимся сохранять русский текст в базе данных');

SELECT title, description
FROM lessons;

Обратите внимание на две детали: тип NVARCHAR и префикс N перед строками

Почему нужен NVARCHAR

VARCHAR хранит текст в однобайтовой кодировке, которая зависит от настроек сортировки и кодовой страницы. Для английского текста это обычно незаметно, а вот кириллица может сохраняться некорректно

NVARCHAR хранит Unicode-текст, поэтому подходит для русского языка, смешанных языков, emoji и данных, где заранее неизвестно, какие символы придут от пользователя

Плохой вариант:

CREATE TABLE notes (
    text_value VARCHAR(100)
);

Лучший вариант для русского текста:

CREATE TABLE notes (
    text_value NVARCHAR(100)
);

Зачем нужен префикс N

Даже если колонка создана как NVARCHAR, строковый литерал без N SQL Server может сначала интерпретировать как обычную строку, а уже потом преобразовать к Unicode. На этом шаге русские символы могут потеряться

Плохой вариант:

INSERT INTO notes (text_value)
VALUES ('Привет, SQL');

Правильный вариант:

INSERT INTO notes (text_value)
VALUES (N'Привет, SQL');

Если вы видите вместо русских букв знаки вопроса, проверьте именно эту пару: тип колонки и наличие N

Что такое collation и когда он важен

Collation влияет на сравнение и сортировку строк: учитывается ли регистр, как сравниваются русские буквы, как работает поиск

Посмотреть сортировку базы можно так:

SELECT DATABASEPROPERTYEX(DB_NAME(), 'Collation') AS database_collation;

Посмотреть сортировку колонок:

SELECT
    TABLE_NAME,
    COLUMN_NAME,
    COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('varchar', 'nvarchar', 'char', 'nchar');

Если русский текст хранится нормально, но поиск или сортировка ведут себя странно, причина может быть в collation

Как проверить, что проблема не в SSMS

Иногда данные сохранены правильно, но их неудобно смотреть из-за настроек вывода, шрифта или копирования. Проверьте текст через простой запрос:

SELECT
    text_value,
    LEN(text_value) AS symbols_count,
    DATALENGTH(text_value) AS bytes_count
FROM notes;

Для NVARCHAR размер в байтах обычно больше количества символов, потому что символы хранятся в Unicode

Мини-практика

Создайте две колонки и сравните поведение:

CREATE TABLE russian_test (
    id INT IDENTITY PRIMARY KEY,
    bad_text VARCHAR(100),
    good_text NVARCHAR(100)
);

INSERT INTO russian_test (bad_text, good_text)
VALUES ('Русский текст', N'Русский текст');

SELECT *
FROM russian_test;

Если в первой колонке текст испортился, а во второй остался нормальным, значит проблема была в типе данных и строковом литерале

Частые ошибки

  • Создать колонку VARCHAR, а потом пытаться хранить в ней русский текст
  • Вставлять русскую строку без префикса N
  • Менять сортировку базы после загрузки данных и ждать, что испорченный текст восстановится
  • Путать проблему хранения с проблемой отображения в клиентской программе
  • Использовать TEXT или NTEXT в новых схемах вместо VARCHAR(MAX) и NVARCHAR(MAX)

Что почитать дальше по SQL

Если нужен общий маршрут по теме, откройте рубрику SQL. Для соседних задач пригодятся эти разборы:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x