2015-04-16 4 views
4

Я не знаю, почему у меня такое странное поведение на mysql 5.6.24, вы можете мне помочь? Как вы думаете, что это ошибкаmysql максимальный размер строки

mysql -D database --default_character_set utf8 -e "ALTER TABLE abc_folder ADD COLUMN lev10 varchar(5000);" 

ERROR 1118 (42000) в строке 1: размер строки слишком велик. Максимальный размер строки для используемого типа таблицы, не считая BLOB, составляет 65535. Это включает в себя накладные расходы на хранение, проверьте руководство. Вы должны изменить некоторые столбцы в TEXT или BLOB-

вместо

mysql -D database --default_character_set utf8 -e "ALTER TABLE abc_folder ADD COLUMN lev10 varchar(50000);" 

Другими словами, запись больше VARCHAR() принят и работает правильно. Кто-нибудь знает, что происходит?

+0

Я предполагаю, что где-то 'varchar()' превращается в некоторый тип типа данных 'text', но я не могу найти ссылку на это в документации. –

+0

Пожалуйста, предоставьте 'SHOW CREATE TABLE fnbl_folder'. Это может помочь с комментарием @GordonLinoff, и это может объяснить, что произошло. –

ответ

1

Эта ошибка означает, что в вашей таблице abc_folder одна строка будет больше 65535 байт без столбцов типа TEXT или BLOBS. 65535 - это наивысшее число, которое может быть представлено беззнаковым 16-битным двоичным числом. И, как указано here:

Хотя InnoDB поддерживает ряд размеров больше, чем 65535 байт внутри, сам MySQL накладывает ограничение строк размера 65535 для общего размера всех столбцов:

mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000), 
    -> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000), 
    -> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB; 
ERROR 1118 (42000): Row size too large. The maximum row size for the 
used table type, not counting BLOBs, is 65535. You have to change some 
columns to TEXT or BLOBs 

Этих означает, что в MySQL MySQL, вероятно, использует 16-байтовый номер для хранения размера строки.

Чтобы исправить вашу ошибку, я предлагаю изменить VARCHAR (5000) в TEXT или использовать несколько таблиц. Используя ТЕКСТ, если вы хотите наложить ограничение в 5000 байт на свой столбец, вы должны использовать функцию усечения при вставке в таблицу. Вы можете использовать substr.

INSERT INTO abc_folder (lev10) VALUES (SUBSTR('Some Text',0, 5000)) 
Смежные вопросы