Найкращий тип поля бази даних для 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.