Мені потрібно зберігати URL-адресу в таблиці MySQL. Яка найкраща практика для визначення поля, яке містить URL із невизначеною довжиною?
Мені потрібно зберігати URL-адресу в таблиці MySQL. Яка найкраща практика для визначення поля, яке містить URL із невизначеною довжиною?
Відповіді:
Найнижча максимальна довжина знаменника серед популярних веб-браузерів: 2 083 (Internet Explorer)
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 байт, який поділяється між усіма стовпцями) та використовуваного набору символів.Отже ...
<MySQL 5.0.3 використовувати TEXT
або
> = MySQL 5.0.3 використовувати VARCHAR (2083)
VARCHAR(2083)
, просто використовуйте TEXT
.
VARCHAR(512)
(або подібне) повинно бути достатнім. Однак, оскільки ви насправді не знаєте максимальної довжини розглянутих URL-адрес, я можу просто перейти до TEXT
. Небезпека цього полягає, звичайно, у втраті ефективності через те, що CLOB
s набагато повільніше, ніж простий тип даних типу рядка VARCHAR
.
varchar(max)
для SQLServer2005
varchar(65535)
для MySQL 5.0.3 та новіших версій
Це виділить сховище за потребою і не повинно впливати на продуктивність.
max
магічний специфікатор ANSI SQL для збільшення розміру VARCHAR у міру необхідності, чи це лише мета-змінна заради прикладу?
Ви хочете , щоб вибрати між TEXT або стовпці VARCHAR на основі , як часто буде використовуватися URL і якщо ви на самому справі потрібно довжину , щоб бути непов'язаним.
Використовуйте VARCHAR з максимальною довжиною > = 2,083 як запропонований micahwittman, якщо:
Використовуйте ТЕКСТ, якщо:
Вам слід використовувати VARCHAR з кодуванням символів ASCII. URL-адреси кодуються відсотками, а міжнародні доменні імена використовують punycode, тому ASCII достатньо для їх зберігання. Це використовуватиме набагато менше місця, ніж UTF8.
VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Це дійсно залежить від вашого випадку використання (див. Нижче), але зберігання як 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
)
Нотатки та застереження
Більшість веб-переглядачів дозволять вам розміщувати дуже велику кількість даних в URL-адресі, і таким чином багато речей створюють дуже великі URL-адреси, тому якщо ви говорите про щось більше, ніж частину домену URL-адреси, вам потрібно буде використовувати стовпець TEXT з моменту VARCHAR / CHAR обмежені .
Я не знаю про інші браузери, але IE7 має обмеження 2083 символів для HTTP GET-операцій . Якщо інші веб-переглядачі мають нижчі межі, я не бачу, для чого вам знадобиться більше символів, ніж 2083 рік.
Більшість веб-серверів мають обмеження довжини URL-адреси (саме тому код помилки для "URI занадто довгий"), тобто практичний верхній розмір. Знайдіть обмеження довжини за замовчуванням для найпопулярніших веб-серверів і використовуйте найбільший з них як максимальний розмір поля; її має бути більш ніж достатньо.
Вам краще використовувати 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, тому це також залежить від інших полів та набору символів.