Прелюдия
- Мой вопрос игнорирует «наибольшее значение, которое вы фактически можете передать между клиентом и сервером, определяется объемом доступной памяти и размером коммуникационных буферов».
- Я также не принимаю здесь во внимание 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-х ответов правильный? (Предположим, что один из них.)