Miglior tipo di campo del database per un URL


352

Devo memorizzare un URL in una tabella MySQL. Qual è la migliore pratica per definire un campo che conterrà un URL con una lunghezza indeterminata?


1
Dipende da cosa hai bisogno, indicizzazione, unicità?
Thomas Decaux,

2
Mi aspettavo una risposta abbastanza semplice qui, ma ero piuttosto sorpreso dalle risposte che riguardavano elementi che non avevo considerato. Lettura molto interessante che ho aggiunto al mio account educativo.
HPWD,

1
Basta andare con il TEXTtipo e saltare leggendo tutte queste risposte di seguito. Alla fine, questo è ciò che la maggior parte di loro suggerisce. :) Naturalmente, se hai bisogno di indicizzazione o unicità, cerca VARCHAR, poiché TEXTnon può essere indicizzato così facilmente .
Aleksandar,

Risposte:


324
  1. Lunghezza massima dell'URL massimo del denominatore comune tra i browser Web più diffusi: 2.083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html I
    valori nelle colonne VARCHAR sono stringhe di lunghezza variabile. La lunghezza può essere specificata come un valore compreso tra 0 e 255 prima di MySQL 5.0.3 e tra 0 e 65.535 nella versione 5.0.3 e successive. La lunghezza massima effettiva di un VARCHAR in MySQL 5.0.3 e versioni successive è soggetta alla dimensione massima della riga (65.535 byte, condivisa tra tutte le colonne) e al set di caratteri utilizzato.

  3. Quindi ...
    <MySQL 5.0.3 usa TEXT
    o
    > = MySQL 5.0.3 usa VARCHAR (2083)


14
Buona risposta, ma personalmente limiterei la lunghezza. A seconda del progetto, potresti voler limitare gli URL accettati. Chi usa url longet di 200?
Giovanni,

2
Faranno meglio a trovare un tipo di dati uri che "capisca" la struttura di uri in modo che l'indicizzazione e la ricerca vengano eseguite in modo efficiente, come l'oracolo ha fatto ... aspetta, mysql ora è l'oracolo ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben

80
Questa risposta è un po 'fuorviante. Si noti che "Il minimo comune denominatore" qui non ha senso, si desidera utilizzare il numero più alto accettato da un browser o server (che non è coerente e soggetto a modifiche). Come dice il tuo link: " ... la specifica del protocollo HTTP non specifica alcuna lunghezza massima ... ", quindi non preoccuparti di ciò VARCHAR(2083), basta usare TEXT.
Wesley Murch,

4
Esempio, anche dal tuo link: " Dopo 65.536 caratteri, la barra degli indirizzi non visualizza più l'URL in Windows Firefox 1.5.x. Tuttavia, funzioneranno URL più lunghi. Ho smesso di testare dopo 100.000 caratteri. "
Wesley Murch

1
La risorsa boutell.com è caduta dalla rete. Ecco un riferimento ad esso in un libro di O'Reilly scannerizzato: books.google.ca/…
micahwittman,

33

VARCHAR(512)(o simile) dovrebbe essere sufficiente. Tuttavia, poiché non conosci davvero la lunghezza massima degli URL in questione, potrei semplicemente andare direttamente a TEXT. Il pericolo con questo è ovviamente la perdita di efficienza a causa CLOBdel fatto che è molto più lento di un tipo di dati stringa semplice come VARCHAR.


che dire della collazione?
kommradHomer,

16

varchar(max) per SQLServer2005

varchar(65535) per MySQL 5.0.3 e versioni successive

Ciò assegnerà lo spazio di archiviazione in base alle necessità e non dovrebbe influire sulle prestazioni.


1
Nel tuo frammento, è maxun identificatore magico ANSI SQL per aumentare le dimensioni di VARCHAR se necessario, o è solo una meta-variabile per amor di esempio?
Daniel Spiewak,

4
In MySQL molto probabilmente non puoi avere un varchar così grande a meno che non sia l'unica colonna nella tabella.
Carson,

1
@Daniel Spiewak: "La differenza fondamentale tra TEXT e VARCHAR (MAX) è che un tipo TEXT memorizzerà sempre i dati in un BLOB mentre il tipo VARCHAR (MAX) tenterà di archiviare i dati direttamente nella riga a meno che non superi gli 8k limitazione e a quel punto lo memorizza in un blob. " stackoverflow.com/questions/834788/… Ma la domanda riguardava MySQL, quindi qui non è rilevante.
Stijn Bollen,

9

Ti consigliamo di scegliere tra una colonna TESTO o VARCHAR in base alla frequenza con cui l'URL verrà utilizzato e se hai effettivamente bisogno che la lunghezza non sia vincolata.

Utilizzare VARCHAR con lunghezza massima> = 2.083 come suggerito da micahwittman se:

  1. Utilizzerai molti URL per query (a differenza delle colonne TEXT, i VARCHAR sono memorizzati in linea con la riga)
  2. Sei abbastanza sicuro che un URL non supererà mai il limite di righe di 65.535 byte.

Usa TEXT se:

  1. L'URL potrebbe davvero infrangere il limite di 65.535 byte
  2. Le tue query non selezioneranno o aggiorneranno un gruppo di URL contemporaneamente (o molto spesso). Questo perché le colonne TEXT contengono solo un puntatore in linea e gli accessi casuali coinvolti nel recupero dei dati di riferimento possono essere dolorosi.

9

È necessario utilizzare un VARCHAR con una codifica di caratteri ASCII. Gli URL sono codificati in percentuale e i nomi di dominio internazionali utilizzano punycode, quindi ASCII è sufficiente per memorizzarli. Questo utilizzerà molto meno spazio di UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL

5
UTF-8 non usa più spazio quando deve solo?
kommradHomer,

7

Questo dipende in realtà dal tuo caso d'uso (vedi sotto), ma la memorizzazione TEXTha problemi di prestazioni e un VARCHARsuono enorme come eccessivo nella maggior parte dei casi.

Il mio approccio: utilizzare una VARCHARlunghezza generosa, ma non irragionevolmente grande , come VARCHAR(500)o così, e incoraggiare gli utenti che hanno bisogno di un URL più grande per utilizzare un accorciatore di URL come safe.mn.

L'approccio di Twitter: per una UX davvero piacevole, fornire un accorciatore automatico di URL per URL troppo lunghi e memorizzare la "versione di visualizzazione" del collegamento come frammento dell'URL con puntini di sospensione alla fine. (Esempio: http://stackoverflow.com/q/219569/1235702verrebbe visualizzato come stackoverflow.com/q/21956...e verrebbe collegato a un URL abbreviato http://ex.ampl/e1234)

Note e avvertenze

  • Ovviamente, l'approccio di Twitter è più bello, ma per le esigenze della mia app, raccomandare un accorciatore di URL era sufficiente.
  • Gli accorciatori di URL hanno i loro svantaggi, come i problemi di sicurezza. Nel mio caso, non è un rischio enorme perché gli URL non sono pubblici e non sono molto utilizzati; tuttavia, questo ovviamente non funzionerà per tutti. safe.mn sembra bloccare molti URL di spam e phishing, ma consiglierei comunque cautela.
  • Assicurati di notare che non dovresti forzare i tuoi utenti a utilizzare un accorciatore di URL. Nella maggior parte dei casi (almeno per le esigenze della mia app), 500 caratteri sono eccessivamente sufficienti per ciò che la maggior parte degli utenti utilizzerà. Utilizzare / raccomandare un accorciatore di URL solo per collegamenti troppo lunghi.

10
Se stai fornendo un accorciatore di URL integrato, non dovrai comunque archiviare l'URL integrale in un database da qualche parte affinché funzioni? :-)
Neil Neyman,

2
Ovviamente; ma dubito che la maggior parte delle persone scriverebbe il proprio accorciatore. Da quando ho scritto questo, ho imparato che ci sono molte API per accorciare gli URL (71 sono elencate qui: programmableweb.com/news/… ), quindi puoi automatizzare il processo senza nemmeno scrivere il tuo. Dipende ancora dalla conoscenza e dal consenso dell'utente, ovviamente.
Brokethebuildagain,



1

La maggior parte dei server Web ha un limite di lunghezza dell'URL (motivo per cui esiste un codice di errore per "URI troppo lungo"), il che significa che esiste una dimensione superiore pratica. Trova il limite di lunghezza predefinito per i server Web più diffusi e utilizzane il più grande come dimensione massima del campo; dovrebbe essere più che sufficiente.


1

È meglio usare varchar (max) che (in termini di dimensioni) significa varchar (65535). Ciò consentirà anche di archiviare i tuoi indirizzi Web più grandi e di risparmiare spazio.

L'identificatore massimo espande le capacità di archiviazione dei tipi di dati varchar, nvarchar e varbinary. varchar (max), nvarchar (max) e varbinary (max) sono chiamati collettivamente tipi di dati di grande valore. È possibile utilizzare i tipi di dati di valore elevato per memorizzare fino a 2 ^ 31-1 byte di dati.

Vedi questo articolo su TechNet sull'uso dei tipi di dati di grande valore


varchar (max)è la sintassi di SQL Server, non adatta a MySQL (come nella domanda originale). Inoltre non significa che varchar (65535)65535 è il numero massimo di caratteri ASCII in una riga in mysql, quindi dipende anche dagli altri campi e dal set di caratteri.
furins
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.