Нужно ли учитывать символ окончания строки (0x00) в VARCHAR?

У меня есть таблица в которой есть столбец username VARCHAR(16).
Если я указываю тип VARCHAR(16) будет ли там учитываться \0-символ в конце строки или нет?
Если я подам в запросе строку "abcdefghijkmnopq" длинной 16 символов она поместится?


Ответы (2 шт):

Автор решения: Мелкий

Нет, не нужно. Это ограничение размера именно в символах (не в байтах), именно в прикладном смысле без учёта деталей машинной реализации (будь то хранение NULL-терминатора, хранение отдельно явной длины строки в байтах или ещё как на усмотрение разработчика самой СУБД)

→ Ссылка
Автор решения: CrazyElf

\0 символ в конце строки - это чисто фича языка C. В других языках и в SQL строки хранятся по-другому: дополнительно к самой строке хранится ещё длина строки, это занимает дополнительные 2 байта, которые не учитываются, когда вы указываете сколько байт хотите хранить в VARCHAR.

Так что да, уместится. Но если вы захотите сохранить строку такой же длины не в латинице, а в кириллице, то нет, не уместится. Чтобы уместилось, вам нужно будет объявить тип NCHAR или NVARCHAR, тогда длина будет указываться в парах байтов, с расчётом на хранение двухбайтовых символов.

Хотя опять же, это всё зависит от конкретной кодировки, которую вы используете в БД, но обычно так.

P.S. Инфа выше приведена для MS SQL, в других реализациях SQL может быть по-другому.

→ Ссылка