Najlepszy typ pola bazy danych dla adresu URL

Muszę zapisać adres url w tabeli MySQL. Jaka jest najlepsza praktyka definiowania pola, które będzie zawierać adres URL o nieokreślonej długości?

Author: micahwittman, 2008-10-20

10 answers

  1. Najniższy wspólny mianownik maksymalna długość URL wśród popularnych przeglądarek internetowych: 2,083 (Internet Explorer)

  2. Http://dev.mysql.com/doc/refman/5.0/en/char.html
    wartości w kolumnach VARCHAR są ciągami o zmiennej długości. Długość może być określona jako wartość od 0 do 255 przed MySQL 5.0.3, a 0 do 65,535 w 5.0.3 i nowszych wersjach. Efektywna maksymalna długość VARCHARA w MySQL 5.0.3 i nowszych zależy od maksymalny rozmiar wiersza (65 535 bajtów, który jest współdzielony między wszystkimi kolumnami) i używany zestaw znaków.

  3. Więc ...
    TEXT
    lub
    > = MySQL 5.0.3 use VARCHAR(2083)

 278
Author: micahwittman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 19:55:27

VARCHAR(512) (lub podobne) powinny być wystarczające. Ponieważ jednak tak naprawdę nie znasz maksymalnej długości adresów URL, o których mowa, mogę po prostu przejść bezpośrednio do TEXT. Niebezpieczeństwo związane z tym to oczywiście utrata wydajności ze względu na to, że CLOBS są znacznie wolniejsze niż prosty typ danych typu string, taki jak VARCHAR.

 32
Author: Daniel Spiewak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 19:31:31

varchar(max) dla SQLServer2005

varchar(65535) dla MySQL 5.0.3 i nowszych

Spowoduje to przydzielenie pamięci jako potrzeby i nie powinno wpływać na wydajność.

 16
Author: Bob Probst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-09 21:38:57

Będziesz chciał wybrać pomiędzy tekstem lub kolumną VARCHAR na podstawie jak często będzie używany adres URL i czy rzeczywiście potrzebujesz długości, aby być niezwiązanym.

Użyj VARCHAR z maxlength >= 2,083 jak zasugerował micahwittman Jeśli:

    W przeciwieństwie do kolumn tekstowych, Varchary są przechowywane w wierszu)
  1. jesteś prawie pewien, że adres URL nigdy nie przekroczy limitu wiersza 65,535 bajtów.

Użyj tekst Jeśli:

    Adres URL naprawdę może złamać 65,535 bajtowy limit wiersza
  1. Twoje zapytania nie wybierają ani nie aktualizują kilku adresów URL na raz (lub bardzo często). Dzieje się tak dlatego, że kolumny tekstowe po prostu trzymają wskaźnik w linii, a losowe dostępy związane z pobieraniem danych odniesienia mogą być bolesne.
 9
Author: mrgrieves,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:33

Powinieneś używać VARCHAR z kodowaniem znaków ASCII. Adresy URL są zakodowane w procentach, a międzynarodowe nazwy domen używają punycode, więc ASCII wystarczy do ich przechowywania. Będzie to wymagało znacznie mniej miejsca niż UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
 8
Author: Flavio Tordini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-18 10:00:03

Większość przeglądarek pozwoli Ci umieścić bardzo duże ilości danych w URL i w ten sposób wiele rzeczy kończy się tworzeniem bardzo dużych adresów URL, więc jeśli mówisz o czymś więcej niż domenowa część adresu URL, będziesz musiał użyć kolumny tekstowej, ponieważ VARCHAR/CHAR są ograniczone.

 4
Author: carson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 19:33:44

To naprawdę zależy od Twojego przypadku użycia( patrz poniżej), ale przechowywanie jako TEXT ma problemy z wydajnością, a ogromny VARCHAR brzmi jak przesada w większości przypadków.

Moje podejście: używaj hojnej, ale nie bezzasadnie dużej długości VARCHAR, takiej jak VARCHAR(500) lub tak, i zachęcaj użytkowników, którzy potrzebują większego adresu URL, aby używali skrótu URL, takiego jak safe.mn.

Podejście na Twitterze: dla naprawdę ładnego UX, zapewnij automatyczne skracanie adresów URL dla zbyt długich adresów URL i przechowuj "Wyświetl wersję" łącza jako fragment adresu URL z wielokropkami na końcu. (Przykład: http://stackoverflow.com/q/219569/1235702 będzie wyświetlany jako stackoverflow.com/q/21956... i będzie linkował do skróconego adresu URL http://ex.ampl/e1234)

Uwagi i zastrzeżenia

  • oczywiście podejście Twittera jest ładniejsze, ale dla potrzeb mojej aplikacji, rekomendowanie skrócenia adresu URL było wystarczające.
  • skróty URL mają swoje wady, takie jak kwestie bezpieczeństwa. W moim przypadku nie jest to duże ryzyko, ponieważ adresy URL nie są publiczne i nie są mocno używane; jednak to oczywiście nie będzie działać dla wszystkich. safe.mn wygląda na to, że blokuje wiele spamu i phishingowych adresów URL, ale nadal zalecam ostrożność.
  • pamiętaj, że nie powinieneś zmuszać użytkowników do używania skrótu URL. W większości przypadków (przynajmniej dla potrzeb mojej aplikacji) 500 znaków jest zbyt wystarczające do tego, do czego większość użytkowników będzie go używać. używaj / polecaj tylko Skracacz URL dla zbyt długich linków.
 4
Author: CullenJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 22:09:49

Nie znam się na innych przeglądarkach, ale IE7 ma limit 2083 znaków dla operacji HTTP GET . Chyba, że inne przeglądarki mają niższe limity, nie rozumiem, dlaczego potrzebujesz więcej znaków niż 2083.

 3
Author: matt b,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 19:33:54

Lepiej Użyj varchar (max) Co (pod względem wielkości) oznacza varchar (65535). To będzie nawet przechowywać większe adresy internetowe i pozwoli zaoszczędzić miejsce, jak również.

Specyfikacja max rozszerza możliwości przechowywania varchar, typy danych nvarchar i varbinary. varchar (max), nvarchar (max) oraz varbinary (max) są zbiorczo nazywane typami danych o dużej wartości. Możesz użyj typów danych o dużej wartości do przechowywania do 2^31-1 bajtów danych.

Zobacz to Artykuł o Technecie o używaniu typów danych o dużej wartości

 1
Author: sohaiby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-24 12:33:44

Większość serwerów internetowych ma limit długości adresu URL (dlatego jest kod błędu "URI za długi"), co oznacza, że istnieje praktyczny górny Rozmiar. Znajdź domyślny limit długości dla najpopularniejszych serwerów internetowych i użyj największego z nich jako maksymalnego rozmiaru pola; powinno to być więcej niż wystarczające.

 0
Author: CesarB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-20 19:50:11