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?
Più basso comune denominatore lunghezza massima dell’URL tra i browser Web più diffusi: 2,083 (Internet Explorer)
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.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:
Usa TEXT se:
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
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.