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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Тип поля MySQL для данных неизвестной длины

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Vinyl
Отправлено: 24 Мая, 2013 - 19:57:28
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Всем доброго вечера по Москве)

Стоит задача выбрать тип поля 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? Спасибо.


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
EuGen Администратор
Отправлено: 24 Мая, 2013 - 20:14:28
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Укажите это в требованиях к приложению. Вообще, если установлен MySQL >=5, то, как правило, это 5.0.33 community и выше.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Vinyl
Отправлено: 24 Мая, 2013 - 20:17:05
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




EuGen, спасибо.


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
Мелкий Супермодератор
Отправлено: 24 Мая, 2013 - 20:57:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Vinyl пишет:
посему работает медленнее varchar

Есть варианты. Varchar вычитывается всегда, даже когда не нужен для результата.

Vinyl пишет:
Подскажите по varchar, опасно ли использовать 65535?

Безопасно, другой вопрос, что столько использовать вы не сможете. 64кб - максимальный размер строки в таблице, т.е. сумма максимальных длин всех полей.


-----
PostgreSQL DBA
 
 Top
Vinyl
Отправлено: 24 Мая, 2013 - 21:00:42
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Мелкий пишет:
максимальный размер строки в таблице, т.е. сумма максимальных длин всех полей.


Т.е. в одной таблице я могу использовать 1 поле varchar 64Кб, либо два поля по 32 Кб, либо 4 по 16? Правильно понял?


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
EuGen Администратор
Отправлено: 24 Мая, 2013 - 21:05:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Правильно. Независимо от 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)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Vinyl
Отправлено: 24 Мая, 2013 - 21:08:23
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




А как же быть, если понадобится больше? И нужны поля, у которых можно установить Default? Не создавать же отдельные таблицы, это абсурд, на мой взгляд.


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
EuGen Администратор
Отправлено: 24 Мая, 2013 - 21:11:35
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Придётся объединять вручную (JOIN), это ограничение, к сожалению, невозможно преодолеть.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Vinyl
Отправлено: 24 Мая, 2013 - 21:19:58
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




А это ограничение и text и blob касается?


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
EuGen Администратор
Отправлено: 24 Мая, 2013 - 21:37:01
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Данных - нет, это ограничение не касается (поскольку они хранятся отдельно), но, тем не менее, само объявление такой колонки, разумеется, войдёт в общую длину строки (то есть, длина указателя будет учитываться)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Vinyl
Отправлено: 24 Мая, 2013 - 21:42:14
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 645
Дата рег-ции: Янв. 2012  
Откуда: Армавир, Краснодарский край


Помог: 15 раз(а)




Понял. Тогда, наверное, придется пренебречь скоростью, организовать вставку Default-значения на уровне приложения и использовать тип полей text. Спасибо ещё раз!


-----
Пессимисты пользуются die(), оптимисты - exit()
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB