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?
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ć .
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.
Więc ...
<MySQL 5.0.3 użyj TEXT
lub
> = MySQL 5.0.3 użyj VARCHAR (2083)
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.
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:
Użyjesz wielu adresów URL na zapytanie (w przeciwieństwie do kolumn TEKSTOWYCH, zmienne VARCHAR są przechowywane w wierszu)
Jesteś pewien, że adres URL nigdy nie przekroczy limitu wiersza 65 535 bajtów.
Użyj TEKSTU, jeśli:
Adres URL naprawdę może przekroczyć limit 65 535 bajtów
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.
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'NOTNULL
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.
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
4
Większość przeglądarek pozwala na umieszczanie bardzo dużych ilości danych w adresie URL, a zatem wiele rzeczy kończy się tworzeniem bardzo dużych adresów URL, więc jeśli mówisz o czymś więcej niż część adresu URL domeny, musisz użyć kolumny TEKST, ponieważ VARCHAR / CHAR są ograniczone .
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.
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ć.
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.
TEXT
typ 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, skorzystajVARCHAR
, ponieważTEXT
nie można tak łatwo zaindeksować .Odpowiedzi:
źródło
VARCHAR(2083)
, po prostu użyjTEXT
.VARCHAR(512)
(lub podobny) powinien wystarczyć. Ponieważ jednak tak naprawdę nie znasz maksymalnej długości danych adresów URL, mogę przejść bezpośrednio doTEXT
. 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 stringVARCHAR
.źródło
varchar(max)
dla SQLServer2005varchar(65535)
dla MySQL 5.0.3 i nowszychSpowoduje to alokację przestrzeni dyskowej w razie potrzeby i nie powinno wpłynąć na wydajność.
źródło
max
magiczny specyfikator ANSI SQL zwiększa rozmiar VARCHAR w razie potrzeby, czy jest to tylko meta-zmienna dla przykładu?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:
Użyj TEKSTU, jeśli:
źródło
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.
źródło
To naprawdę zależy od twojego przypadku użycia (patrz niżej), ale przechowywanie tak jak
TEXT
ma problemy z wydajnością, a wVARCHAR
większości przypadków brzmi jak przesada.Moje podejście: używaj hojnej, ale nieuzasadnionej dużej
VARCHAR
długości, takiej jak taVARCHAR(500)
, i zachęcaj użytkowników, którzy potrzebują większego adresu URL, do korzystania z skracacza URL, takiego jaksafe.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/1235702
byłby wyświetlany jakostackoverflow.com/q/21956...
i prowadziłby do skróconego adresu URLhttp://ex.ampl/e1234
)Uwagi i zastrzeżenia
źródło
Większość przeglądarek pozwala na umieszczanie bardzo dużych ilości danych w adresie URL, a zatem wiele rzeczy kończy się tworzeniem bardzo dużych adresów URL, więc jeśli mówisz o czymś więcej niż część adresu URL domeny, musisz użyć kolumny TEKST, ponieważ VARCHAR / CHAR są ograniczone .
źródło
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.
źródło
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ć.
źródło
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.Zobacz ten artykuł w witrynie TechNet na temat korzystania z typów danych o dużej wartości
ź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.