Всем доброго вечера по Москве)
Стоит задача выбрать тип поля MySql для данных неизвестной длины. Там могут быть как 5-10 символов UTF-8, так и 10'000-20'000. Вариантов рассматриваю два: varchar(65535) и text. Насколько я знаю, поле Text не хранит сами данные, а содержит указатель на файл с данными, посему работает медленнее varchar. Т.е., нежелательно. С другой стороны, некоторые отговаривают от использования varchar(65535) в силу того, что старые версии mysql поддерживают длину поля типа varchar только до 255.
Какой из вариантов использовали бы вы?
UPD. Только сейчас вспомнил, что нужно будет использовать атрибут DEFAULT, чего text не умеет. Text отпал сам по себе. Подскажите по varchar, опасно ли использовать 65535? Какова вероятность того, что приложение поставят на сервере, на котором MySQL стоит ниже 5.0.3? Спасибо.
1. Vinyl - 24 Мая, 2013 - 19:57:28 - перейти к сообщению
2. EuGen - 24 Мая, 2013 - 20:14:28 - перейти к сообщению
Укажите это в требованиях к приложению. Вообще, если установлен MySQL >=5, то, как правило, это 5.0.33 community и выше.
3. Vinyl - 24 Мая, 2013 - 20:17:05 - перейти к сообщению
EuGen, спасибо.
4. Мелкий - 24 Мая, 2013 - 20:57:35 - перейти к сообщению
Vinyl пишет:
посему работает медленнее varchar
Есть варианты. Varchar вычитывается всегда, даже когда не нужен для результата.
Vinyl пишет:
Подскажите по varchar, опасно ли использовать 65535?
Безопасно, другой вопрос, что столько использовать вы не сможете. 64кб - максимальный размер строки в таблице, т.е. сумма максимальных длин всех полей.
5. Vinyl - 24 Мая, 2013 - 21:00:42 - перейти к сообщению
Мелкий пишет:
максимальный размер строки в таблице, т.е. сумма максимальных длин всех полей.
Т.е. в одной таблице я могу использовать 1 поле varchar 64Кб, либо два поля по 32 Кб, либо 4 по 16? Правильно понял?
6. EuGen - 24 Мая, 2013 - 21:05:11 - перейти к сообщению
Правильно. Независимо от storage-engine сумма размеров всех полей не должна превосходить 65535 байт (то есть, на самом деле не 64Кб, а 64Кб - 1 байт). Обратите внимание, что для utf8, например, символ занимает до 3 байт, что наложит дополнительные ограничения по числу символов. Аналогично и для других многобайтовых кодировок.
CODE (htmlphp):
скопировать код в буфер обмена
скопировать код в буфер обмена
- row length = 1
- + (sum of column lengths)
- + (number of NULL columns + delete_flag + 7)/8
- + (number of variable-length columns)