Domanda

Solo per chiarire, specificando qualcosa come Varchar (45) significa che può richiedere al massimo 45 caratteri? Ricordo di aver sentito qualcuno qualche anno fa che il numero tra parentesi non si riferisce al numero di personaggi, quindi la persona ha cercato di spiegarmi qualcosa di abbastanza complicato che non capisco e non ho già dimenticato.

E qual è la differenza tra Char e Varchar? Ho cercato un po 'e vedo che Char ti dà il massimo della dimensione della colonna ed è meglio utilizzarla se i tuoi dati hanno una dimensione fissa e usa VarChar se la dimensione dei dati varia.

Ma se ti dà il massimo della dimensione della colonna di tutti i dati di questa colonna, non è meglio utilizzarli quando la dimensione dei dati varia? Soprattutto se non sai quanto saranno grandi le dimensioni dei tuoi dati. Varchar deve specificare la dimensione (il char non ha davvero bisogno, giusto?), Non è più problematico?

È stato utile?

Soluzione

Devi anche specificare la dimensione con CHAR. Insieme a CHAR, i valori della colonna sono imbottiti con spazi per riempire le dimensioni specificate, mentre con VARCHAR, è memorizzato solo il valore effettivo specificato.

Per esempio:

CREATE TABLE test (
    char_value CHAR(10),
    varchar_value VARCHAR(10)
);

INSERT INTO test VALUES ('a', 'b');

SELECT * FROM test;

Quanto sopra selezionerà "a" per char_value e "b" per varchar_value

Se tutti i tuoi valori hanno circa le stesse dimensioni, il CHAR è forse una scelta migliore perché richiederà spesso meno spazio di archiviazione rispetto a VARCHAR. Questo è perché VARCHAR memorizza sia la lunghezza del valore che il valore stesso, mentre CHAR può semplicemente memorizzare il valore (dimensionario).

Altri suggerimenti

Il Documentazione MySQL Fornisce una buona spiegazione dei requisiti di archiviazione dei vari tipi di dati.

In particolare, per una stringa di lunghezza L, a CHAR(M) DataType occuperà byte (M XC) (dove C è il numero di byte richiesti per archiviare un carattere ... Questo dipende dal carattere impostato in uso). UN VARCHAR(M) Prenderà (L + 1) o (L + 2) a seconda che M sia <= 255 o> 255.

Quindi, dipende davvero da quanto tempo ti aspetti che siano le tue stringhe, quale sarà la variazione di lunghezza.

NB: la documezione non discute l'impatto dei set di caratteri sui requisiti di archiviazione di a VARCHAR genere. Ho provato a citarlo accuratamente, ma la mia ipotesi è che dovresti moltiplicare la lunghezza della stringa per la larghezza del byte del personaggio e per ottenere il requisito di archiviazione.

Char e Varchar diventano in realtà irrilevanti se hai solo 1 campo di lunghezza variabile nella tua tabella, come un Varchar o un testo. MySQL cambierà automaticamente tutti i char in varchar.

Il record di lunghezza/dimensione fissa può offrire prestazioni aggiuntive, ma non è possibile utilizzare tipi di campo di lunghezza variabile. Il motivo è che sarà più veloce e più facile per MySQL trovare il prossimo record.

Ad esempio, se si esegue un selezione * dalla tabella limite 10, MySQL deve scansionare il file della tabella per il decimo record. Ciò significa trovare la fine di ogni record fino a trovare la fine del decimo record. Ma se la tabella ha record di lunghezza/dimensione fissa, MySQL deve solo conoscere la dimensione del record e quindi saltare 10 x #Bytes.

Se sai che una colonna conterrà un numero piccolo e fisso di caratteri usa un carbone, altrimenti utilizzare un varchar. Una colonna Char è imbottita alla lunghezza massima.

Varchar ha un piccolo sovraccarico (4-8 byte a seconda di RDBMS), ma utilizza solo il numero eccessivo + il numero effettivo di caratteri memorizzati.

Per i valori che sai che saranno costanti, ad esempio per numeri di telefono, codici postali ecc., È ottimale usare di sicuro "char".

La roba complicata che non ricordi è che i 45 si riferiscono a byte, non a caratteri. Non è lo stesso se si utilizza una codifica di carattere multibyte. In Oracle è possibile specificare esplicitamente byte o caratteri.

varchar2(45 BYTE)

o

varchar2(45 CHAR)

Vedere Differenza tra byte e char nei dati di colonna

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top