Лучший тип поля базы данных для URL
Мне нужно сохранить url-адрес в таблице MySQL. Какова наилучшая практика определения поля, которое будет содержать URL-адрес с неопределенной длиной?
10 ответов
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 использовать тип varchar(2083)
VARCHAR(512)
(или аналогичный) должно быть достаточно. Однако, поскольку вы действительно не знаете максимальную длину рассматриваемых URL-адресов, я могу просто перейти к TEXT
. Опасность с этим, конечно, потеря эффективности из-за CLOB
s намного медленнее, чем простой строковый тип данных, такой как VARCHAR
.
varchar(max)
для SQLServer2005
varchar(65535)
для MySQL 5.0.3 и выше
Это позволит выделить память по мере необходимости и не должно влиять на производительность.
вы хотите выбрать между текстом или столбцом VARCHAR на основе Как часто будет использоваться URL и Ли на самом деле нужна длина, чтобы быть свободным.
использовать тип varchar С maxlength >= 2,083 as micahwittman предложил если:
- вы будете использовать много URL-адресов на запрос (в отличие от текстовых столбцов, VARCHARs хранятся в строке)
- вы уверены, что URL никогда не будет превышать предел строки 65,535 байт.
использовать текст если :
- URL действительно может нарушить ограничение строки 65,535 байт
- ваши запросы не будут выбирать или обновлять кучу 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 слишком долго"), что означает, что существует практический верхний размер. Найдите ограничение длины по умолчанию для наиболее популярных веб-серверов и используйте самый большой из них в качестве максимального размера поля; этого должно быть более чем достаточно.