Нужно ли учитывать длину нулевого символа при определении длины столбца CHAR фиксированной ширины? - PullRequest
0 голосов
/ 25 октября 2019

Раньше я думал, что для размещения, скажем, строки 'Hello' потребуется столбец CHAR(6), а не столбец CHAR(5).


Примечание

Это, конечно, предполагает кодировку UTF-8.

Я понимаю, что n в CHAR(n) относится к количеству байтов , используемыхв хранилище а не количество символов .

Независимо от того, вопрос остается актуальным. Предполагая систему кодирования один байт на символ, строка 'Hello' почти во всех языках (кроме очень немногих, которые используют еще больше символов для записи длин строк, например, BSTR и HLSTR) содержит символ нулевого завершения.


Я попытался создать таблицу со столбцом CHAR(5), и она поместила строку 'Hello' в столбец CHAR(5) в моей базе данных SQL Server 2017.

Получаетсячто не нужно приспосабливаться к длине нулевого символа при определении столбца CHAR(n) фиксированной длины.

Может кто-то подтвердить, если это так?

Я знаю, что этоСовершенно очевидно из проведенного эксперимента, но я не могу игнорировать вероятность того, что я что-то упустил.

ОБНОВЛЕНИЕ

В комментариях к этому вопросу пользователь SMor пишет:

Нет - «n» в «char (n)» не относится к количеству байтов, оно относится к числу символов. Прекратите предполагать и начните читать документацию. Вы не определяете длину для поддержки символа завершения.

Я хотел бы отметить, что я прочитал документацию до того, как опубликовал этот вопрос. В документации однозначно говорится по этому вопросу :

char [(n)] Строковые данные фиксированного размера. n определяет размер строки в байтах и ​​должен быть значением от 1 до 8000. Для однобайтовых наборов символов кодирования, таких как латиница, размер хранилища составляет n байтов, а количество символов, которое можно сохранить, также равно n. Для наборов символов многобайтового кодирования размер хранилища по-прежнему составляет n байтов, но количество символов, которое можно сохранить, может быть меньше, чем n. Синоним ISO для char - символ . Для получения дополнительной информации о наборах символов см. Наборы однобайтовых и многобайтовых символов .

Более подробно об этом говорится в разделе Замечания :

Распространенным заблуждением является думать, что CHAR (n) и VARCHAR (n), n определяет количество символов. Но в CHAR (n) и VARCHAR (n) n определяет длину строки в байтах (0-8000). n никогда не определяет количество символов, которые могут быть сохранены. Это похоже на определение NCHAR (n) и NVARCHAR (n).

...