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

352

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

Джесси Хаттабо
источник
1
Это зависит от того, что вам нужно, индексация, уникальность?
Томас Деко
2
Я ожидал довольно простой ответ здесь, но был довольно удивлен ответами, охватывающими пункты, которые я не рассматривал. Очень интересное чтение, которое я добавил в свой учебный аккаунт.
HPWD
1
Просто TEXTнаберите текст и пропустите чтение всех этих ответов ниже. В конце концов, это то, что большинство из них предлагают. :) Конечно, если вам нужна индексация или уникальность, продолжайте VARCHAR, так как TEXTне может быть легко проиндексирован .
Александр

Ответы:

324
  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 использует TEXT
    или
    > = MySQL 5.0.3 использует VARCHAR (2083)

micahwittman
источник
14
Хороший ответ, но лично я бы ограничил длину. В зависимости от проекта вы можете ограничить количество принятых URL. Кто использует URL длиннее 200?
Джон
2
Им лучше придумать тип данных uri, который «понимает» структуру uri, чтобы индексирование и поиск выполнялись эффективно, как это делал oracle ... подождите, mysql теперь является oracle's ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
Redben
80
Этот ответ немного вводит в заблуждение. Обратите внимание, что «Самый низкий общий знаменатель» здесь не имеет смысла, вы хотите использовать наибольшее число, которое примет браузер или сервер (что не соответствует и может быть изменено). Как сказано в вашей ссылке: « ... в спецификации протокола HTTP не указана максимальная длина ... », так что не беспокойтесь об этом VARCHAR(2083), просто используйте TEXT.
Уэсли Мёрч
4
Пример, а также из вашей ссылки: « После того, как 65536 символов, больше адресная строка не отображает URL в Windows , Firefox 1.5.x. Однако, более длинные URL - адреса будут работать я перестал испытывать после 100000 символов.. »
Уэсли Марч
1
Ресурс boutell.com упал в сети. Вот ссылка на это в отсканированной книге О'Рейли: books.google.ca/…
micahwittman
33

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

Даниэль Спивак
источник
как насчет сопоставления?
kommradHomer
16

varchar(max) для SQLServer2005

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

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

Боб Пробст
источник
1
Является maxли в вашем фрагменте магический спецификатор ANSI SQL для увеличения размера VARCHAR по мере необходимости, или это просто мета-переменная для примера?
Даниэль Спивак
4
В MySQL вы, скорее всего, не можете иметь такой большой varchar, если это не единственный столбец в таблице.
Carson
1
@Daniel Spiewak: «Основное различие между TEXT и VARCHAR (MAX) заключается в том, что тип TEXT всегда будет хранить данные в BLOB-объекте, тогда как тип VARCHAR (MAX) будет пытаться сохранить данные непосредственно в строке, если он не превышает 8k. ограничение и в этот момент он хранит его в виде капли ". stackoverflow.com/questions/834788/… Но вопрос был о MySQL, так что это не очень актуально здесь.
Стейн Боллен
9

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

Использование VARCHAR с MAXLENGTH> = 2083 , как micahwittman предлагается , если:

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

Используйте ТЕКСТ, если:

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

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

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Флавио Тордини
источник
5
разве UTF-8 не использует больше места, когда это только нужно?
kommradHomer
7

Это действительно зависит от вашего варианта использования (см. Ниже), но хранение в нем 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-адреса не являются общедоступными и не используются; однако, это очевидно не будет работать для всех. Safe.mn блокирует множество спамовых и фишинговых URL, но я все равно рекомендую осторожность.
  • Обязательно обратите внимание, что вы не должны заставлять своих пользователей использовать сокращатель URL. В большинстве случаев (по крайней мере, для нужд моего приложения) 500 символов слишком много для того, для чего его будет использовать большинство пользователей. Используйте / рекомендуйте сокращение URL для слишком длинных ссылок.
brokethebuildagain
источник
10
Если вы предоставляете встроенное сокращение URL, вам все равно нужно будет хранить полный URL-адрес в базе данных где-нибудь, чтобы он работал? :-)
Нил Нейман,
2
Конечно; но я сомневаюсь, что большинство людей написали бы свое собственное сокращение. С момента написания этой статьи я узнал, что существует множество API для сокращения URL (здесь перечислены 71: programmableweb.com/news/… ), так что вы можете автоматизировать процесс, даже не создавая свой собственный. Конечно, это зависит от знаний и согласия пользователя.
brokethebuildagain
4

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

Carson
источник
1

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

CesarB
источник
1

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

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

См. Эту статью на TechNet об использовании типов данных больших значений.

sohaiby
источник
varchar (max)синтаксис SQLServer, не подходит для MySQL (как в оригинальном вопросе). Более того, это не означает, что varchar (65535)65535 - это максимальное количество символов ASCII в строке в mysql, поэтому оно зависит также от других полей и набора символов.
Фуринс