Лучший тип поля базы данных для URL

Мне нужно сохранить url-адрес в таблице MySQL. Какова наилучшая практика определения поля, которое будет содержать URL-адрес с неопределенной длиной?

10 ответов


  1. наименьший общий знаменатель максимальная длина URL среди популярных веб-браузеров:2,083 (Internet Explorer)

  2. 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 байт, который разделяется между всеми столбцами) и используемого набора символов.

  3. Так ...
    текст
    или
    >= С MySQL 5.0.3 использовать тип varchar(2083)


VARCHAR(512) (или аналогичный) должно быть достаточно. Однако, поскольку вы действительно не знаете максимальную длину рассматриваемых URL-адресов, я могу просто перейти к TEXT. Опасность с этим, конечно, потеря эффективности из-за CLOBs намного медленнее, чем простой строковый тип данных, такой как VARCHAR.


varchar(max) для SQLServer2005

varchar(65535) для MySQL 5.0.3 и выше

Это позволит выделить память по мере необходимости и не должно влиять на производительность.


вы хотите выбрать между текстом или столбцом VARCHAR на основе Как часто будет использоваться URL и Ли на самом деле нужна длина, чтобы быть свободным.

использовать тип varchar С maxlength >= 2,083 as micahwittman предложил если:

  1. вы будете использовать много URL-адресов на запрос (в отличие от текстовых столбцов, VARCHARs хранятся в строке)
  2. вы уверены, что URL никогда не будет превышать предел строки 65,535 байт.

использовать текст если :

  1. URL действительно может нарушить ограничение строки 65,535 байт
  2. ваши запросы не будут выбирать или обновлять кучу URL-адресов сразу (или очень часто). Это связано с тем, что текстовые столбцы просто содержат указатель inline, и случайные обращения, связанные с получением ссылочных данных, могут быть болезненными.

вы должны использовать VARCHAR с кодировкой символов ASCII. URL-адреса закодированы в процентах, а международные доменные имена используют punycode, поэтому ASCII достаточно для их хранения. Это будет использовать гораздо меньше места, чем UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL

большинство браузеров позволит вам поставить очень большие объемы данных в URL и, таким образом, многие вещи в конечном итоге создают очень большие URL-адреса, поэтому, если вы говорите о чем-то большем, чем доменная часть URL-адреса, вам нужно будет использовать текстовый столбец с VARCHAR / CHAR ограничены.


это действительно зависит от вашего варианта использования (см. ниже), но хранить как 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)

примечания и предостережения

  • очевидно, что подход Twitter лучше, но для нужд моего приложения было достаточно рекомендовать сокращение URL.
  • у сокращателей URL есть свои недостатки, такие как проблемы безопасности. В моем случае, это не огромный риск, потому что URL-адреса не являются общедоступными и не сильно используются; однако это, очевидно, не будет работать для всех. в безопасности.mn, похоже, блокирует много спама и фишинговых URL-адресов, но я все равно рекомендую осторожность.
  • обязательно обратите внимание, что вы не должны заставлять своих пользователей использовать сокращатель URL. В большинстве случаев (по крайней мере, для нужд моего приложения) 500 символов слишком достаточно для того, для чего большинство пользователей будут использовать его. используйте / рекомендуйте только URL-адрес для слишком длинного связи.

Я не знаю о других браузерах, но IE7 имеет ограничение в 2083 символа для операций HTTP GET. Если какие-либо другие браузеры не имеют нижних пределов, я не понимаю, зачем вам нужно больше символов, чем 2083.


лучше использовать varchar (max) что (с точки зрения размера) означает varchar (65535). Это даже сохранит ваши большие веб-адреса и сэкономит ваше пространство.

спецификатор max расширяет возможности хранения varchar, тип nvarchar и varbinary. varchar (max), nvarchar(max), и varbinary (max) в совокупности называются типами данных с большим значением. Вы можете используйте типы данных с большим значением для хранения до 2^31-1 байт данные.

посмотреть в этой статье на сайте TechNet о использование типов данных больших значений


большинство веб-серверов имеют ограничение длины URL (поэтому существует код ошибки для "URI слишком долго"), что означает, что существует практический верхний размер. Найдите ограничение длины по умолчанию для наиболее популярных веб-серверов и используйте самый большой из них в качестве максимального размера поля; этого должно быть более чем достаточно.