В 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. Для соседних задач пригодятся эти разборы:
- SQL Server Configuration Manager: где открыть и что в нем смотреть
- SQL Server Management Studio скачать: как правильно установить SSMS
- SQL Server Management Studio: как подключиться к локальному серверу
- SQL Server Profiler: что это и как пользоваться



