Это зависит от того, что вам нужно, индексация, уникальность?
Томас Деко
2
Я ожидал довольно простой ответ здесь, но был довольно удивлен ответами, охватывающими пункты, которые я не рассматривал. Очень интересное чтение, которое я добавил в свой учебный аккаунт.
HPWD
1
Просто TEXTнаберите текст и пропустите чтение всех этих ответов ниже. В конце концов, это то, что большинство из них предлагают. :) Конечно, если вам нужна индексация или уникальность, продолжайте VARCHAR, так как TEXTне может быть легко проиндексирован .
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)
Хороший ответ, но лично я бы ограничил длину. В зависимости от проекта вы можете ограничить количество принятых 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 .
Является 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 предлагается , если:
Вы будете использовать много URL для каждого запроса (в отличие от столбцов TEXT, VARCHAR хранятся в строке вместе со строкой)
Вы уверены, что URL никогда не превысит ограничение строки в 65 535 байт.
Используйте ТЕКСТ, если:
URL действительно может нарушить ограничение строки в 65 535 байт
Ваши запросы не будут выбирать или обновлять несколько URL-адресов сразу (или очень часто). Это связано с тем, что столбцы TEXT просто содержат встроенный указатель, и случайный доступ, связанный с получением ссылочных данных, может быть болезненным.
Вы должны использовать VARCHAR с кодировкой символов ASCII. URL-адреса кодируются в процентах, а в международных доменных именах используется punycode, поэтому для их хранения достаточно ASCII. Это займет гораздо меньше места, чем UTF8.
VARCHAR(512) CHARACTER SET'ascii'COLLATE'ascii_general_ci'NOTNULL
разве 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 для слишком длинных ссылок.
Если вы предоставляете встроенное сокращение URL, вам все равно нужно будет хранить полный URL-адрес в базе данных где-нибудь, чтобы он работал? :-)
Нил Нейман,
2
Конечно; но я сомневаюсь, что большинство людей написали бы свое собственное сокращение. С момента написания этой статьи я узнал, что существует множество API для сокращения URL (здесь перечислены 71: programmableweb.com/news/… ), так что вы можете автоматизировать процесс, даже не создавая свой собственный. Конечно, это зависит от знаний и согласия пользователя.
brokethebuildagain
4
Большинство браузеров позволяют вам помещать очень большие объемы данных в URL-адрес, и поэтому многие вещи заканчивают тем, что создают очень большие URL-адреса, поэтому, если вы говорите о чем-то большем, чем доменная часть URL-адреса, вам нужно будет использовать столбец TEXT, так как VARCHAR / CHAR ограничены .
Большинство веб-серверов имеют ограничение длины 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, поэтому оно зависит также от других полей и набора символов.
TEXT
наберите текст и пропустите чтение всех этих ответов ниже. В конце концов, это то, что большинство из них предлагают. :) Конечно, если вам нужна индексация или уникальность, продолжайтеVARCHAR
, так какTEXT
не может быть легко проиндексирован .Ответы:
источник
VARCHAR(2083)
, просто используйтеTEXT
.VARCHAR(512)
(или аналогичный) должно быть достаточно. Однако, поскольку вы на самом деле не знаете максимальную длину URL-адресов, о которых идет речь, я могу просто перейти непосредственно кTEXT
. Опасность в этом заключается, конечно, в потере эффективности из-заCLOB
того, что она намного медленнее, чем простой тип данных типа строкиVARCHAR
.источник
varchar(max)
для SQLServer2005varchar(65535)
для MySQL 5.0.3 и вышеЭто будет выделять память по мере необходимости и не должно влиять на производительность.
источник
max
ли в вашем фрагменте магический спецификатор ANSI SQL для увеличения размера VARCHAR по мере необходимости, или это просто мета-переменная для примера?Вы хотите , чтобы выбрать между TEXT или столбца VARCHAR на основе , как часто будет использоваться URL и ли вы на самом деле нужно длину , чтобы быть несвязанным.
Использование VARCHAR с MAXLENGTH> = 2083 , как micahwittman предлагается , если:
Используйте ТЕКСТ, если:
источник
Вы должны использовать VARCHAR с кодировкой символов ASCII. URL-адреса кодируются в процентах, а в международных доменных именах используется punycode, поэтому для их хранения достаточно ASCII. Это займет гораздо меньше места, чем UTF8.
источник
Это действительно зависит от вашего варианта использования (см. Ниже), но хранение в нем
TEXT
имеет проблемы с производительностью, и вVARCHAR
большинстве случаев это звучит как избыточное количество.Мой подход: используйте щедрую, но не слишком большую
VARCHAR
длину, такую какVARCHAR(500)
или около того, и поощряйте пользователей, которым нужен больший URL, использовать сокращение URL, такое какsafe.mn
.Подход Twitter: для действительно приятного UX обеспечьте автоматическое сокращение URL-адресов для слишком длинных URL-адресов и сохраните «отображаемую версию» ссылки в виде фрагмента URL-адреса с эллипсами в конце. (Пример:
http://stackoverflow.com/q/219569/1235702
будет отображаться какstackoverflow.com/q/21956...
и будет ссылаться на сокращенный URLhttp://ex.ampl/e1234
)Примечания и предостережения
источник
Большинство браузеров позволяют вам помещать очень большие объемы данных в URL-адрес, и поэтому многие вещи заканчивают тем, что создают очень большие URL-адреса, поэтому, если вы говорите о чем-то большем, чем доменная часть URL-адреса, вам нужно будет использовать столбец TEXT, так как VARCHAR / CHAR ограничены .
источник
Я не знаю о других браузерах, но IE7 имеет ограничение в 2083 символа для операций HTTP GET . Если у других браузеров нет более низких лимитов, я не понимаю, зачем вам нужно больше символов, чем 2083.
источник
Большинство веб-серверов имеют ограничение длины URL-адреса (поэтому существует код ошибки для «слишком длинного URI»), что означает практический верхний размер. Найдите ограничение длины по умолчанию для самых популярных веб-серверов и используйте самый большой из них в качестве максимального размера поля; этого должно быть более чем достаточно.
источник
Вам лучше использовать varchar (max), что (с точки зрения размера) означает
varchar (65535)
. Это даже сохранит ваши большие веб-адреса и сэкономит ваше пространство.См. Эту статью на TechNet об использовании типов данных больших значений.
источник
varchar (max)
синтаксис SQLServer, не подходит для MySQL (как в оригинальном вопросе). Более того, это не означает, чтоvarchar (65535)
65535 - это максимальное количество символов ASCII в строке в mysql, поэтому оно зависит также от других полей и набора символов.