Мне нужно хранить URL в таблице MySQL. Каков наилучший способ определения поля, которое будет содержать URL с неопределенной длиной?
Мне нужно хранить URL в таблице MySQL. Каков наилучший способ определения поля, которое будет содержать URL с неопределенной длиной?
Ответы:
Максимальная длина URL в общем знаменателе среди популярных веб-браузеров: 2 083 (Internet Explorer)
http://dev.mysql.com/doc/refman/5.0/en/char.html
Значения в столбцах VARCHAR являются строками переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в 5.0.3 и более поздних версиях. Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который распределяется между всеми столбцами) и используемого набора символов.Итак ...
<MySQL 5.0.3 использует TEXT
или
> = MySQL 5.0.3 использует VARCHAR (2083)
VARCHAR(2083), просто используйте TEXT.
VARCHAR(512)(или аналогичный) должно быть достаточно. Однако, поскольку вы на самом деле не знаете максимальную длину URL-адресов, о которых идет речь, я могу просто перейти непосредственно к TEXT. Опасность в этом заключается, конечно, в потере эффективности из-за CLOBтого, что она намного медленнее, чем простой тип данных типа строкиVARCHAR .
varchar(max) для SQLServer2005
varchar(65535) для MySQL 5.0.3 и выше
Это будет выделять память по мере необходимости и не должно влиять на производительность.
maxли в вашем фрагменте магический спецификатор ANSI SQL для увеличения размера VARCHAR по мере необходимости, или это просто мета-переменная для примера?
Вы хотите , чтобы выбрать между TEXT или столбца VARCHAR на основе , как часто будет использоваться URL и ли вы на самом деле нужно длину , чтобы быть несвязанным.
Использование VARCHAR с MAXLENGTH> = 2083 , как micahwittman предлагается , если:
Используйте ТЕКСТ, если:
Вы должны использовать VARCHAR с кодировкой символов ASCII. URL-адреса кодируются в процентах, а в международных доменных именах используется punycode, поэтому для их хранения достаточно ASCII. Это займет гораздо меньше места, чем UTF8.
VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Это действительно зависит от вашего варианта использования (см. Ниже), но хранение в нем TEXTимеет проблемы с производительностью, и в VARCHARбольшинстве случаев это звучит как избыточное количество.
Мой подход: используйте щедрую, но не слишком большую VARCHARдлину, такую как VARCHAR(500)или около того, и поощряйте пользователей, которым нужен больший URL, использовать сокращение URL, такое как safe.mn.
Подход Twitter: для действительно приятного UX обеспечьте автоматическое сокращение URL-адресов для слишком длинных URL-адресов и сохраните «отображаемую версию» ссылки в виде фрагмента URL-адреса с эллипсами в конце. (Пример: http://stackoverflow.com/q/219569/1235702будет отображаться как stackoverflow.com/q/21956...и будет ссылаться на сокращенный URL http://ex.ampl/e1234)
Примечания и предостережения
Большинство браузеров позволяют вам помещать очень большие объемы данных в URL-адрес, и поэтому многие вещи заканчивают тем, что создают очень большие URL-адреса, поэтому, если вы говорите о чем-то большем, чем доменная часть URL-адреса, вам нужно будет использовать столбец TEXT, так как VARCHAR / CHAR ограничены .
Я не знаю о других браузерах, но IE7 имеет ограничение в 2083 символа для операций HTTP GET . Если у других браузеров нет более низких лимитов, я не понимаю, зачем вам нужно больше символов, чем 2083.
Большинство веб-серверов имеют ограничение длины URL-адреса (поэтому существует код ошибки для «слишком длинного URI»), что означает практический верхний размер. Найдите ограничение длины по умолчанию для самых популярных веб-серверов и используйте самый большой из них в качестве максимального размера поля; этого должно быть более чем достаточно.
Вам лучше использовать varchar (max), что (с точки зрения размера) означает varchar (65535). Это даже сохранит ваши большие веб-адреса и сэкономит ваше пространство.
Спецификатор max расширяет возможности хранения типов данных varchar, nvarchar и varbinary. varchar (max), nvarchar (max) и varbinary (max) вместе называются типами данных большого значения. Вы можете использовать большие типы данных для хранения до 2 ^ 31-1 байтов данных.
См. Эту статью на TechNet об использовании типов данных больших значений.
varchar (max)синтаксис SQLServer, не подходит для MySQL (как в оригинальном вопросе). Более того, это не означает, что varchar (65535)65535 - это максимальное количество символов ASCII в строке в mysql, поэтому оно зависит также от других полей и набора символов.