LENGTH() и CHAR_LENGTH() в SQL — длина строки в символах и байтах

LENGTH() возвращает длину строки, а CHAR_LENGTH() — количество символов. Аналитик использует их для валидации форматов (телефон, ИНН, промокод) и поиска обрезанных значений. Ключевой нюанс: в MySQL LENGTH() считает байты, а кириллица в utf8mb4 занимает 2 байта на символ — для символов там нужен CHAR_LENGTH(); в PostgreSQL и SQLite LENGTH() уже считает символы.

Синтаксис

LENGTH(строка) / CHAR_LENGTH(строка)

Примеры использования

Пример 1: Найти телефоны неверной длины

SELECT id, phone
FROM users
WHERE LENGTH(phone) <> 12;

Результат:

id | phone
---+-------------
15 | +7916123
23 | 89161234567

Пример 2: Самые длинные payload событий

SELECT
  event_id,
  CHAR_LENGTH(payload) AS len
FROM events
ORDER BY len DESC
LIMIT 2;

Результат:

event_id | len
---------+-----
882      | 1024
571      | 640

Пример 3: Кириллица: байты против символов (MySQL)

SELECT
  LENGTH('привет')      AS bytes,
  CHAR_LENGTH('привет') AS chars;

Результат:

bytes | chars
------+------
12    | 6
Порешать SQL-задачи в тренажёре →

Типичная ошибка

В MySQL LENGTH() возвращает число байтов, и кириллица в utf8mb4 (2 байта/символ) даст вдвое больше, чем ожидаешь — для символов используйте CHAR_LENGTH(). В PostgreSQL и SQLite LENGTH() уже считает символы, а длину в байтах в Postgres даёт OCTET_LENGTH(). Конечные пробелы тоже учитываются, а NULL даёт NULL.

Где спрашивают на собеседовании

Спрашивают при валидации форматов (телефон, ИНН, коды) и поиске обрезанных значений. Идёт в паре с TRIM (чтобы пробелы не искажали счёт) и SUBSTRING.

FAQ: частые вопросы про LENGTH

Чем LENGTH отличается от CHAR_LENGTH?

В MySQL LENGTH считает байты, а CHAR_LENGTH — символы, поэтому для многобайтовых символов (кириллица, эмодзи) они расходятся. В PostgreSQL и SQLite LENGTH уже возвращает число символов, а CHAR_LENGTH работает как синоним.

Как получить длину строки в байтах в PostgreSQL?

Используйте OCTET_LENGTH(str) — она вернёт число байтов, тогда как LENGTH(str) в Postgres считает символы. В MySQL наоборот: байты уже возвращает сам LENGTH(), а символы — CHAR_LENGTH().

Считает ли LENGTH конечные пробелы?

Да, ведущие и конечные пробелы входят в подсчёт. Если нужна «содержательная» длина, оберните аргумент в TRIM: LENGTH(TRIM(col)). Учтите, что в колонках типа CHAR(n) некоторые СУБД дополняют строку пробелами.

Задачи в тренажёре по теме

Смежные темы SQL

Строковые функции · Агрегации

Другие функции SQL

STRING_AGG · COUNT · SUM OVER · SUBSTR · ROUND · CONCAT

Открыть SQL-тренажёр (565 задач) →