In MySQL, se creo un nuovo VARCHAR(32)
campo in una tabella UTF-8 significa che posso memorizzare 32 byte di dati in quel campo o 32 caratteri (multibyte)?
In MySQL, se creo un nuovo VARCHAR(32)
campo in una tabella UTF-8 significa che posso memorizzare 32 byte di dati in quel campo o 32 caratteri (multibyte)?
Risposte:
Questa risposta è stata visualizzata nella parte superiore dei risultati di ricerca di Google ma non era corretta, quindi:
La confusione è probabilmente dovuta alle diverse versioni di mysql in fase di test.
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
MySQL interpreta le specifiche di lunghezza nelle definizioni delle colonne di caratteri in unità di caratteri. (Prima di MySQL 4.1, le lunghezze delle colonne venivano interpretate in byte.) Questo vale per i tipi CHAR, VARCHAR e TEXT.
È interessante notare che (non ci avevo pensato) la lunghezza massima di una colonna varchar è influenzata da utf8 come segue:
La lunghezza massima effettiva di un VARCHAR in MySQL 5.0.3 e versioni successive è soggetta alla dimensione massima delle righe (65.535 byte, condivisa tra tutte le colonne) e al set di caratteri utilizzato. Ad esempio, i caratteri utf8 possono richiedere fino a tre byte per carattere, quindi una colonna VARCHAR che utilizza il set di caratteri utf8 può essere dichiarata con un massimo di 21.844 caratteri.
utf8mb4
) può memorizzare "💩💩💩💩💩💩💩💩💩💩" (10 pile di cacca), ovvero 10 caratteri ma 40 byte.
ti consentirebbe di memorizzare 32 caratteri multibyte
Per risparmiare spazio con UTF-8, usa VARCHAR invece di CHAR. Altrimenti, MySQL deve riservare tre byte per ogni carattere in una colonna CHARACTER SET utf8 perché questa è la lunghezza massima possibile. Ad esempio, MySQL deve riservare 30 byte per una colonna CHAR (10) CHARACTER SET utf8.
CHAR
e quando lo faccio non è destinato a memorizzare caratteri multibyte, quindi sono al sicuro. Che dire VARCHAR
, sei sicuro che il limite sia definito in caratteri multibyte e non in caratteri a byte singolo?
32 multibyte di dati per le varchar(32)
regole di confronto utf8_unicode_ci
, ho appena testato con XAMPP.
1234567890123456789012345678901234567890
Ottieni troncato a:
12345678901234567890123456789012
Tieni presente che questi non sono caratteri ASCII regolari.
utf8
, ma poi ottieni un supporto Unicode non funzionante in MySQL. Dovresti utf8mb4
invece usare la codifica, perché ci sono max. 4 byte in un carattere utf-8 , non 3 come nella variante MySQL di utf8 ...
È preferibile utilizzare "char" per tabelle di aggiornamento molto frequenti perché la lunghezza totale dei dati della riga sarà fissa e veloce. Le colonne Varchar rendono dinamiche le dimensioni dei dati delle righe. Non va bene per MyISAM, ma non conosco InnoDB e altri. Ad esempio, se hai una colonna "tipo" molto stretta, potrebbe essere meglio usare char (2) con latin1 charset per richiedere solo uno spazio minimo.
CHAR
. Per InnoDB, stanno accadendo così tante altre cose che il dibattito sulla "dimensione dinamica / fissa delle righe" è essenzialmente irrilevante.
CHAR
.
Se ti connetti al database utilizzando la codifica latin1 (ad esempio con PHP) per salvare una stringa PHP UTF8 in una colonna MySQL UTF8, avrai una doppia codifica UTF8.
Se la stringa UTF8 $s
è lunga 32 caratteri ma 64 byte e la colonna è VARCHAR(32)
UTF8, la doppia codifica convertirà la stringa $s
in una stringa UTF8 lunga 64 caratteri che verrà troncata nel database ai suoi 32 primi caratteri corrispondenti ai primi 32 byte di $s
. Potresti finire per pensare che MySQL 5 si comporti come MySQL 4 ma in realtà è una seconda causa per lo stesso effetto.