Это называется «нулевое завершение», и это действительно дерьмовый способ обработки строк. Следовательно, это строковый тип по умолчанию, а также многие другие потоки данных в C, и это лишь часть того, почему C и большинство вещей, основанных на нем, являются тупицами.
Обычно большинство SQL-движков, таких как MySQL, НЕ используют нулевое завершение, предпочитая быть «ограниченными по длине», что означает, что целое число без знака, хранящееся в виде байта, слова, двойного слова или даже qword, используется, чтобы сказать, как долго строка находится в самом начале.
начало данных, чтобы вы знали, где они заканчиваются, ПРЕЖДЕ ЧЕМ дойдете до конца.
Иногда это называют строками в стиле Паскаля. Они позволяют более эффективно и быстро выполнять строковые операции, по крайней мере, на архитектурах на базе Intel.
Вот почему в MySQL типы tinytext/tinybob имеют ограничение в 255 байт, но занимают 256, то есть 8 бит.
text/blob использует длину серии 16 бит, поэтому максимальная длина составляет 65534, поскольку из размера структуры данных необходимо отнять два байта (65536/0x010000). То же самое для среднего текста/среднего блоба, которые имеют размер 24 бита, поэтому предел на 3 байта меньше, или для длинного текста/длинного блоба, который на 4 байта меньше 32-битного беззнакового предела, поскольку для хранения длины используются 4 байта.
Хотя, думаю, я знаю, что это такое, благодаря тому, что @JEET поднял эту тему.
Они, вероятно, используют CHAR вместо VARCHAR в своей базе данных, что действительно приводит к добавлению в строку экранированного нуля, поскольку CHAR - единственная строка с нулевым завершением в MySQL.
(Я думаю, не цитируйте меня по этому поводу). Отчасти поэтому CHAR предназначен для дураков и, как известно, несет в себе всевозможный хаос, включая переполнение буфера и эксплойты выполнения... почему? Потому что нулевое завершение — это тупое дерьмо.
Вероятно, это помехи нулевого завершения, а НЕ проблема с кодировкой, поэтому я беру обратно свой предыдущий пост и часть «почти наверняка»! Я почти полностью забыл, что CHAR - это дерьмо "I canz teh prugram?" подход к обработке строк с нулевым завершением; пережиток мэйнфреймов 1970-х годов, который должен был там остаться. Но вместо этого программисты на C думают, что все строки должны работать.