Найкращий тип поля бази даних для URL-адреси


352

Мені потрібно зберігати URL-адресу в таблиці MySQL. Яка найкраща практика для визначення поля, яке містить URL із невизначеною довжиною?


1
Це залежить від того, що вам потрібно, індексація, єдиність?
Томас Деко

2
Я очікував тут досить прямої відповіді, але був дуже здивований відповідями, які стосувалися предметів, які я не розглядав. Дуже цікаве читання, яке я додав у свій освітній рахунок.
HPWD

1
Просто перейдіть з TEXTтипом і пропустіть, прочитавши всі ці відповіді нижче. Зрештою, саме це пропонує більшість із них. :) Звичайно, якщо вам потрібна індексація або унікальність, продовжуйте працювати VARCHAR, оскільки TEXTне можна так легко індексувати .
Олександр

Відповіді:


324
  1. Найнижча максимальна довжина знаменника серед популярних веб-браузерів: 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 555 у версії 5.0.3 та пізніших версіях. Ефективна максимальна довжина VARCHAR у MySQL 5.0.3 та пізніших версіях залежить від максимального розміру рядка (65,535 байт, який поділяється між усіма стовпцями) та використовуваного набору символів.

  3. Отже ...
    <MySQL 5.0.3 використовувати TEXT
    або
    > = MySQL 5.0.3 використовувати VARCHAR (2083)


14
Хороша відповідь, але особисто я би обмежив довжину. Залежно від проекту, ви можете обмежити прийняті URL-адреси. Хто використовує URL-лонгет понад 200?
Джон

2
Вони краще придумують тип даних урі, який "розуміє" структуру урі, щоб індексація та пошук здійснювалися ефективно, як це робив oracle ... зачекайте, mysql зараз є оракулом ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben

80
Ця відповідь трохи вводить в оману. Зауважте, що "Найнижчий загальний знаменник" тут безглуздий, ви хочете використовувати найвищу кількість, яку візьме браузер або сервер (що не узгоджується і може змінюватися). Як говорить ваше посилання: " ... специфікація протоколу HTTP не визначає жодної максимальної довжини ... ", тому не турбуйтеся з цим VARCHAR(2083), просто використовуйте TEXT.
Веслі Мерч

4
Приклад, також за вашим посиланням: " Після 65 536 символів рядок розташування більше не відображає URL-адресу в Windows Firefox 1.5.x. Однак довші URL-адреси працюватимуть. Я припинив тестування після 100 000 символів ".
Веслі Мерч

1
Ресурс boutell.com впав з мережі. Ось посилання на нього у відсканованій книзі O'Reilly: books.google.ca/…
micahwittman

33

VARCHAR(512)(або подібне) повинно бути достатнім. Однак, оскільки ви насправді не знаєте максимальної довжини розглянутих URL-адрес, я можу просто перейти до TEXT. Небезпека цього полягає, звичайно, у втраті ефективності через те, що CLOBs набагато повільніше, ніж простий тип даних типу рядка VARCHAR.


як щодо порівняння?
kommradHomer

16

varchar(max) для SQLServer2005

varchar(65535) для MySQL 5.0.3 та новіших версій

Це виділить сховище за потребою і не повинно впливати на продуктивність.


1
Чи є у вашому фрагменті maxмагічний специфікатор ANSI SQL для збільшення розміру VARCHAR у міру необхідності, чи це лише мета-змінна заради прикладу?
Даніель Шпієк

4
У MySQL, швидше за все, не може бути такого великого варшара, якщо це не єдиний стовпець у таблиці.
carson

1
@Daniel Spiewak: "Основна відмінність TEXT від VARCHAR (MAX) полягає в тому, що тип TEXT завжди буде зберігати дані в блобі, тоді як тип VARCHAR (MAX) намагатиметься зберігати дані безпосередньо в рядку, якщо тільки це не перевищує 8k обмеження, і в цей момент він зберігає його в краплі ". stackoverflow.com/questions/834788/… Але питання стосувалося MySQL, тому це насправді не актуально.
Штійн Боллен

9

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

Використовуйте VARCHAR з максимальною довжиною > = 2,083 як запропонований micahwittman, якщо:

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

Використовуйте ТЕКСТ, якщо:

  1. URL-адреса дійсно може перевищити обмеження в 65 555 байт
  2. Ваші запити не виберуть або оновлять купу URL-адрес відразу (або дуже часто). Це відбувається тому, що стовпці TEXT просто містять вказівник в рядку, і випадкові звернення, що беруть участь у отриманні посиланих даних, можуть бути болісними.

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-адрес лише для занадто довгих посилань.

10
Якщо ви надаєте вбудований скорочувач URL-адрес, чи не буде вам все-таки потрібно зберігати повний URL-адресу в базі даних десь для його роботи? :-)
Ніл Нейман

2
Звичайно; але я сумніваюся, що більшість людей написали б свій власний коротше. Починаючи писати це, я дізнався, що існує багато API скорочення URL-адрес (71 перераховані тут: programmableweb.com/news/… ), тож ви могли автоматизувати процес, навіть не написавши власний. Це, звичайно, залежить від знань та згоди користувача.
brokethebuildagain

4

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



1

Більшість веб-серверів мають обмеження довжини URL-адреси (саме тому код помилки для "URI занадто довгий"), тобто практичний верхній розмір. Знайдіть обмеження довжини за замовчуванням для найпопулярніших веб-серверів і використовуйте найбільший з них як максимальний розмір поля; її має бути більш ніж достатньо.


1

Вам краще використовувати varchar (max), що (за розміром) означає varchar (65535). Це навіть збереже ваші великі веб-адреси, а також заощадить ваш простір.

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

Дивіться цю статтю в TechNet про використання типів даних великого значення


varchar (max)є синтаксисом SQLServer, не підходить для MySQL (як у вихідному питанні). Крім того, це не означає, що varchar (65535)65535 - це максимальна кількість символів ASCII в рядку в mysql, тому це також залежить від інших полів та набору символів.
furins
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.