Нужно ли учитывать символ окончания строки (0x00) в VARCHAR?
У меня есть таблица в которой есть столбец username VARCHAR(16)
.
Если я указываю тип VARCHAR(16)
будет ли там учитываться \0
-символ в конце строки или нет?
Если я подам в запросе строку "abcdefghijkmnopq"
длинной 16 символов она поместится?
Ответы (2 шт):
Нет, не нужно. Это ограничение размера именно в символах (не в байтах), именно в прикладном смысле без учёта деталей машинной реализации (будь то хранение NULL-терминатора, хранение отдельно явной длины строки в байтах или ещё как на усмотрение разработчика самой СУБД)
\0
символ в конце строки - это чисто фича языка C
. В других языках и в SQL
строки хранятся по-другому: дополнительно к самой строке хранится ещё длина строки, это занимает дополнительные 2 байта, которые не учитываются, когда вы указываете сколько байт хотите хранить в VARCHAR
.
Так что да, уместится. Но если вы захотите сохранить строку такой же длины не в латинице, а в кириллице, то нет, не уместится. Чтобы уместилось, вам нужно будет объявить тип NCHAR
или NVARCHAR
, тогда длина будет указываться в парах байтов, с расчётом на хранение двухбайтовых символов.
Хотя опять же, это всё зависит от конкретной кодировки, которую вы используете в БД, но обычно так.
P.S. Инфа выше приведена для MS SQL
, в других реализациях SQL
может быть по-другому.