Najlepszy typ pola bazy danych dla adresu URL

352

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

Jesse Hattabaugh
źródło
1
To zależy od tego, czego potrzebujesz, indeksowania, jednorożca?
Thomas Decaux,
2
Spodziewałem się tutaj dość prostej odpowiedzi, ale byłem zaskoczony odpowiedziami obejmującymi przedmioty, których nie rozważałem. Bardzo ciekawa lektura dodana do mojego konta edukacyjnego.
HPWD,
1
Po prostu wybierz TEXTtyp i pomiń czytanie wszystkich tych odpowiedzi poniżej. W końcu tak sugeruje większość z nich. :) Oczywiście, jeśli potrzebujesz indeksowania lub wyjątkowości, skorzystaj VARCHAR, ponieważ TEXTnie można tak łatwo zaindeksować .
Aleksandar,

Odpowiedzi:

324
  1. Najniższa wspólna mianownik maksymalna długość adresu URL wśród popularnych przeglądarek internetowych: 2083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    Wartości w kolumnach VARCHAR są łańcuchami o zmiennej długości. Długość można określić jako wartość od 0 do 255 przed MySQL 5.0.3 i od 0 do 65 535 w 5.0.3 i nowszych wersjach. Efektywna maksymalna długość zmiennej VARCHAR w MySQL 5.0.3 i nowszych zależy od maksymalnego rozmiaru wiersza (65 535 bajtów, który jest współużytkowany przez wszystkie kolumny) i użytego zestawu znaków.

  3. Więc ...
    <MySQL 5.0.3 użyj TEXT
    lub
    > = MySQL 5.0.3 użyj VARCHAR (2083)

micahwittman
źródło
14
Dobra odpowiedź, ale osobiście ograniczę długość. W zależności od projektu możesz ograniczyć akceptowane adresy URL. Kto używa adresu URL długiego niż 200?
Jan
2
Lepiej wymyślą typ danych URI, który „rozumie” strukturę URI, dzięki czemu indeksowanie i wyszukiwanie odbywa się wydajnie, tak jak zrobił to wyrocznia… czekaj, mysql jest teraz wyrocznią… download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben
80
Ta odpowiedź jest trochę myląca. Zauważ, że „Najniższy wspólny mianownik” jest tutaj bez znaczenia, chcesz użyć najwyższej liczby, którą zaakceptuje przeglądarka lub serwer (co nie jest spójne i może ulec zmianie). Jak mówi link: „ ... specyfikacja protokołu HTTP nie określa żadnej maksymalnej długości ... ”, więc nie przejmuj się tym VARCHAR(2083), po prostu użyj TEXT.
Wesley Murch
4
Przykład, również z linku: „ Po 65 536 znakach pasek adresu nie wyświetla już adresu URL w Windows Firefox 1.5.x. Jednak dłuższe adresy URL będą działać. Przestałem testować po 100 000 znaków.
Wesley Murch
1
Zasób boutell.com spadł z sieci. Oto odniesienie w zeskanowanej książce O'Reilly: books.google.ca/…
micahwittman
33

VARCHAR(512)(lub podobny) powinien wystarczyć. Ponieważ jednak tak naprawdę nie znasz maksymalnej długości danych adresów URL, mogę przejść bezpośrednio do TEXT. Niebezpieczeństwem tego jest oczywiście utrata wydajności ze względu na to, CLOBże jest on znacznie wolniejszy niż prosty typ danych typu string VARCHAR.

Daniel Spiewak
źródło
co z zestawieniem?
kommradHomer
16

varchar(max) dla SQLServer2005

varchar(65535) dla MySQL 5.0.3 i nowszych

Spowoduje to alokację przestrzeni dyskowej w razie potrzeby i nie powinno wpłynąć na wydajność.

Bob Probst
źródło
1
Czy w twoim fragmencie maxmagiczny specyfikator ANSI SQL zwiększa rozmiar VARCHAR w razie potrzeby, czy jest to tylko meta-zmienna dla przykładu?
Daniel Spiewak,
4
W MySQL najprawdopodobniej nie możesz mieć tak dużego varchara, chyba że jest to jedyna kolumna w tabeli.
Carson,
1
@Daniel Spiewak: „Podstawowa różnica między TEKSTEM a VARCHAR (MAKS.) Polega na tym, że typ TEKST zawsze przechowuje dane w obiekcie blob, podczas gdy typ VARCHAR (MAKS.) Będzie próbował przechowywać dane bezpośrednio w wierszu, chyba że przekroczy 8k ograniczenie i w tym momencie przechowuje go w kropli. ” stackoverflow.com/questions/834788/... Ale pytanie dotyczyło MySQL, więc nie ma to większego znaczenia.
Stijn Bollen,
9

Będziesz chciał wybrać między kolumną TEKST lub VARCHAR na podstawie częstotliwości używania adresu URL i tego, czy rzeczywiście potrzebujemy długość być niezwiązany.

Użyj VARCHAR z maxlength> = 2083, jak sugerował micahwittman , jeśli:

  1. Użyjesz wielu adresów URL na zapytanie (w przeciwieństwie do kolumn TEKSTOWYCH, zmienne VARCHAR są przechowywane w wierszu)
  2. Jesteś pewien, że adres URL nigdy nie przekroczy limitu wiersza 65 535 bajtów.

Użyj TEKSTU, jeśli:

  1. Adres URL naprawdę może przekroczyć limit 65 535 bajtów
  2. Twoje zapytania nie wybiorą ani nie zaktualizują wielu adresów URL jednocześnie (lub bardzo często). Wynika to z tego, że kolumny TEKSTOWE po prostu trzymają wskaźnik w linii, a losowe dostępy związane z wyszukiwaniem danych odniesienia mogą być bolesne.
mrgrieves
źródło
9

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. To zajmie znacznie mniej miejsca niż UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Flavio Tordini
źródło
5
czy UTF-8 nie zajmuje więcej miejsca, gdy tylko musi?
kommradHomer
7

To naprawdę zależy od twojego przypadku użycia (patrz niżej), ale przechowywanie tak jak TEXTma problemy z wydajnością, a w VARCHARwiększości przypadków brzmi jak przesada.

Moje podejście: używaj hojnej, ale nieuzasadnionej dużej VARCHARdługości, takiej jak ta VARCHAR(500), i zachęcaj użytkowników, którzy potrzebują większego adresu URL, do korzystania z skracacza URL, takiego jak safe.mn.

Podejście do Twittera: Aby uzyskać naprawdę ładny UX, zapewnij automatyczny skrót do zbyt długich adresów URL i zapisz „wersję wyświetlaną” linku jako fragment adresu URL z elipsami na końcu. (Przykład: http://stackoverflow.com/q/219569/1235702byłby wyświetlany jako stackoverflow.com/q/21956...i prowadziłby do skróconego adresu URL http://ex.ampl/e1234)

Uwagi i zastrzeżenia

  • Oczywiście podejście na Twitterze jest ładniejsze, ale dla potrzeb mojej aplikacji wystarczyło skrócenie adresu URL.
  • Skracacze adresów URL mają swoje wady, takie jak problemy związane z bezpieczeństwem. W moim przypadku nie stanowi to dużego ryzyka, ponieważ adresy URL nie są publiczne i nie są często używane; jednak to oczywiście nie zadziała dla wszystkich. Wygląda na to, że safe.mn blokuje wiele adresów spamowych i phishingowych, ale nadal zalecałbym ostrożność.
  • Pamiętaj, że nie powinieneś zmuszać użytkowników do używania skracacza URL. W większości przypadków (przynajmniej na potrzeby 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 skracacz URL tylko w przypadku zbyt długich linków.
brokethebuildagain
źródło
10
Jeśli udostępniasz wbudowany skracacz adresów URL, czy nadal nie musisz przechowywać pełnego adresu URL w bazie danych, aby działał? :-)
Neil Neyman
2
Oczywiście; ale wątpię, by większość ludzi napisała własny skrót. Odkąd to napisałem, dowiedziałem się, że istnieje wiele interfejsów API skracających adresy URL (71 jest tutaj wymienionych: programmableweb.com/news/... ), więc możesz zautomatyzować ten proces, nawet nie pisząc własnego. Oczywiście nadal zależy to od wiedzy i zgody użytkownika.
brokethebuildagain
3

Nie wiem o innych przeglądarkach, ale IE7 ma limit 2083 znaków dla operacji HTTP GET . O ile żadne inne przeglądarki nie mają niższych limitów, nie rozumiem, dlaczego potrzebujesz więcej znaków niż 2083.

matowy b
źródło
1

Większość serwerów WWW ma limit długości adresu URL (dlatego istnieje kod błędu dla „URI za długi”), co oznacza, że ​​istnieje praktyczny większy 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 wystarczyć.

CesarB
źródło
1

Lepiej użyj varchar (max), co (pod względem wielkości) oznacza varchar (65535). Spowoduje to nawet przechowywanie twoich większych adresów internetowych, a także pozwoli zaoszczędzić miejsce.

Specyfikator max rozszerza możliwości przechowywania typów danych varchar, nvarchar i varbinary. varchar (max), nvarchar (max) i varbinary (max) są wspólnie nazywane typami danych o dużej wartości. Za pomocą typów danych o dużej wartości można przechowywać do 2 ^ 31-1 bajtów danych.

Zobacz ten artykuł w witrynie TechNet na temat korzystania z typów danych o dużej wartości

sohaiby
źródło
varchar (max)jest składnią SQLServer, nieodpowiednią dla MySQL (jak w pierwotnym pytaniu). Co więcej, nie oznacza to, varchar (65535)że 65535 to maksymalna liczba znaków ASCII w wierszu w mysql, więc zależy to również od innych pól i zestawu znaków.
furins