Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Тип поля MySQL для данных неизвестной длины
Форумы портала PHP.SU » » Работа с СУБД » Тип поля MySQL для данных неизвестной длины

Страниц (1): [1]
 

1. Vinyl - 24 Мая, 2013 - 19:57:28 - перейти к сообщению
Всем доброго вечера по Москве)

Стоит задача выбрать тип поля 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? Спасибо.
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):
скопировать код в буфер обмена
  1. row length = 1
  2.              + (sum of column lengths)
  3.              + (number of NULL columns + delete_flag + 7)/8
  4.              + (number of variable-length columns)
7. Vinyl - 24 Мая, 2013 - 21:08:23 - перейти к сообщению
А как же быть, если понадобится больше? И нужны поля, у которых можно установить Default? Не создавать же отдельные таблицы, это абсурд, на мой взгляд.
8. EuGen - 24 Мая, 2013 - 21:11:35 - перейти к сообщению
Придётся объединять вручную (JOIN), это ограничение, к сожалению, невозможно преодолеть.
9. Vinyl - 24 Мая, 2013 - 21:19:58 - перейти к сообщению
А это ограничение и text и blob касается?
10. EuGen - 24 Мая, 2013 - 21:37:01 - перейти к сообщению
Данных - нет, это ограничение не касается (поскольку они хранятся отдельно), но, тем не менее, само объявление такой колонки, разумеется, войдёт в общую длину строки (то есть, длина указателя будет учитываться)
11. Vinyl - 24 Мая, 2013 - 21:42:14 - перейти к сообщению
Понял. Тогда, наверное, придется пренебречь скоростью, организовать вставку Default-значения на уровне приложения и использовать тип полей text. Спасибо ещё раз!

 

Powered by ExBB FM 1.0 RC1