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?


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)


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.


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ść.


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.

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

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.

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



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ć.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.