Miglior tipo di campo del database per un URL

Ho bisogno di memorizzare un url in una tabella MySQL. Qual è la migliore pratica per definire un campo che manterrà un URL con una lunghezza indeterminata?

  1. Più basso comune denominatore lunghezza massima dell’URL 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 valore da 0 a 255 prima di MySQL 5.0.3 e da 0 a 65.535 in 5.0.3 e versioni 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, che è condivisa tra tutte le colonne) e al set di caratteri utilizzato.

  3. Così …
    TEXT
    o
    > = MySQL 5.0.3 utilizza VARCHAR (2083)

VARCHAR(512) (o simile) dovrebbe essere sufficiente. Tuttavia, dal momento che non si conosce realmente la lunghezza massima degli URL in questione, potrei semplicemente passare direttamente a TEXT . Il pericolo con questo è naturalmente la perdita di efficienza dovuta al fatto che CLOB è molto più lento di un semplice tipo di stringa come VARCHAR .

varchar(max) per SQLServer2005

varchar(65535) per MySQL 5.0.3 e versioni successive

Ciò allocherà lo storage in base alle necessità e non dovrebbe influire sulle prestazioni.

Dovrai scegliere tra una colonna TEXT o VARCHAR in base alla frequenza con cui verrà utilizzato l’URL e se hai effettivamente bisogno che la lunghezza sia libera.

Usa VARCHAR con lunghezza massima> = 2083 come suggerito da micahwittman se:

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

Usa TEXT se:

  1. L’URL potrebbe davvero rompere il limite di 65.535 righe di 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.

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

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

La maggior parte dei browser ti consente di inserire grandi quantità di dati in un URL e quindi molte cose finiscono per creare URL molto grandi, quindi se stai parlando di qualcosa di più della parte del dominio di un URL dovrai usare una colonna TEXT dal VARCHAR / CHAR sono limitati .

Questo dipende molto dal tuo caso d’uso (vedi sotto), ma la memorizzazione come TEXT ha problemi di prestazioni, e un enorme VARCHAR suona come overkill nella maggior parte dei casi.

Il mio approccio: utilizzare una lunghezza VARCHAR generosa, ma non eccessivamente ampia, come VARCHAR(500) o giù di lì, 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 un UX veramente bello, fornire un abbreviazione URL automatico per URL troppo lunghi e memorizzare la “versione di visualizzazione” del link come uno snippet dell’URL con ellissi alla fine. (Esempio: http://stackoverflow.com/q/219569/1235702 verrà visualizzato come stackoverflow.com/q/21956... e si collegherà a un URL abbreviato http://ex.ampl/e1234 )

Note e avvertimenti

  • Ovviamente, l’approccio di Twitter è più bello, ma per le esigenze della mia app è stato sufficiente consigliare un accorciatore di URL.
  • Gli abbreviazioni URL hanno i loro svantaggi, ad esempio problemi di sicurezza. Nel mio caso, non è un rischio enorme perché gli URL non sono pubblici e non sono molto usati; tuttavia, questo ovviamente non funzionerà per tutti. safe.mn sembra bloccare un sacco di spam e URL di phishing, ma raccomanderei comunque caucanvas.
  • Assicurati di notare che non devi forzare i tuoi utenti a utilizzare un abbreviazione URL. Per la maggior parte dei casi (almeno per le esigenze della mia app), 500 caratteri sono eccessivamente sufficienti per quello che la maggior parte degli utenti userà per. Utilizza solo / consiglia un URL shortener per i link troppo lunghi.

Non conosco altri browser, ma IE7 ha un limite di 2083 caratteri per le operazioni HTTP GET . A meno che nessun altro browser abbia limiti inferiori, non vedo perché avresti bisogno di più caratteri del 2083.

È meglio usare varchar (max) che (in termini di dimensioni) significa varchar (65535) . Questo memorizzerà anche i tuoi indirizzi web più grandi e salverà anche il tuo spazio.

Lo specificatore 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. È ansible utilizzare i tipi di dati di grande valore per archiviare fino a 2 ^ 31-1 byte di dati.

Vedere questo articolo su TechNet sull’utilizzo di tipi di dati di grande valore

La maggior parte dei server Web ha un limite di lunghezza 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ù popolari e utilizza il più grande di essi come dimensione massima del campo; dovrebbe essere più che sufficiente.