Какова максимальная объявленная длина столбца типов MySql TEXT/BLOB?

Прелюдия

  • Мой вопрос игнорирует «наибольшее значение, которое вы фактически можете передать между клиентом и сервером, определяется объемом доступной памяти и размером коммуникационных буферов».
  • Я также не принимаю здесь во внимание Unicode. Я знаю, что если символ использует более 1 байта памяти, фактическая максимальная длина (количество символов) столбцов TEXT уменьшится.

При просмотре документации MySql здесь: http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html, я могу получить 2 ответа на свой вопрос...

1) Более очевидный ответ:

TINYBLOB   : 2 ^  8 - 1 = 255
BLOB       : 2 ^ 16 - 1 = 65535
MEDIUMBLOB : 2 ^ 24 - 1 = 16777215
LONGBLOB   : 2 ^ 32 - 1 = 4294967295

2) Немного более сложный ответ:

TINYBLOB   : 2 ^  8 - 1 = 255
BLOB       : 2 ^ 16 - 2 = 65534
MEDIUMBLOB : 2 ^ 24 - 3 = 16777213
LONGBLOB   : 2 ^ 32 - 4 = 4294967292

MySql хранит размер фактических данных вместе с этими данными. И для того, чтобы хранить этот размер, ему понадобятся:

  • 1 байт, когда данные ‹ 256 B
  • 2 байта, когда данные ‹ 64 КБ
  • 3 байта, когда данные ‹ 16 МБ
  • 4 байта, когда данные ‹ 4 ГБ

Таким образом, чтобы хранить данные плюс размер данных и предотвратить превышение 256/64K/16M/4G байт необходимого хранилища, вам понадобится коэффициент -1/-2/-3/-4 при определении максимального заявленного длина столбца (не -1/-1/-1/-1). Я надеюсь это имеет смысл :)

Вопрос

Какой из этих 2-х ответов правильный? (Предположим, что один из них.)


person Jasper N. Brouwer    schedule 14.11.2012    source источник


Ответы (1)


Это ответ 1.

Из документа, на который вы ссылаетесь:

Они соответствуют четырем типам BLOB и имеют одинаковую максимальную длину и требования к хранению. См. Раздел 11.6, "Требования к хранению типов данных". .

На этой другой странице есть таблица с этими ограничениями. Для LONGBLOB требуется следующее хранилище:

L + 4 байта, где L ‹ 232

L представляет фактическую длину в байтах заданного строкового значения.

Что касается максимальной объявленной длины столбца, просто попробуйте сами:

mysql> create table foo(a blob(4294967295));
Query OK, 0 rows affected (0.08 sec)

mysql> create table bar(a blob(4294967296));
ERROR 1439 (42000): Display width out of range for column 'a' (max = 4294967295)

(Вы не можете объявить размер для трех других типов больших двоичных объектов.)

person Mat    schedule 14.11.2012
comment
Извините, я хотел сослаться на dev.mysql.com/doc /refman/5.5/en/storage-requirements.html, я отредактировал свой вопрос. - person Jasper N. Brouwer; 14.11.2012
comment
Из документов: в следующей таблице M представляет объявленную длину столбца в символах для недвоичных строковых типов и байтах для двоичных строковых типов. L представляет фактическую длину в байтах данного строкового значения. Мой вопрос касается M, а не L. - person Jasper N. Brouwer; 14.11.2012