Differenze tra il tipo char e il varchar in MySQL

Prosegue il mio lavoro insieme a MySQL, ormai lo sto usando intensamente in molti programmi non solo in php, ma anche nella programmazione in java.

Usandolo così massicciamente sto continuando a scoprire cose interessanti. Probabilmente quella di cui vi parlo oggi, non è una novità per qualcuno, ma credo sia bene chiarirla per chi non lo sapesse.

Qualche giorno fa stavo lavorando su un database che non ho creato io e mi sono imbattuto in un campo CHAR. Subito non ci ho fatto caso, ma poi mi è venuto in mente che di solito quando devo dichiarare un campo stringa, uso il tipo VARCHAR. Mi sono così documentato un po’, cercando su google ho trovato diverse spiegazioni su forum, ma come sapete di quello che viene detto sui forum è sempre meglio non fidarsi troppo. Ho fatto quindi direttamente riferimento alla guida ufficiale MySQL (in inglese) e ho scoperto quello che mi interessava.

Innanzitutto prima di MySQL 5.0.3 sia il tipo char sia il varchar potevano essere dimensionati da 0 a 255 caratteri. Da MySQL 5.0.3 in poi il tipo varchar supporta lunghezza da 0 a 65535 caratteri. Oltre a questa differenza di dimensionamento c’è un’altra sostanziale differenza: quando dimensionate un campo con il tipo char, ad esempio char(4) verrà effettivamente occupato spazio per 4 caratteri, anche se il valore che inserirete nel campo sarà di un solo carattere. Lo spazio rimanente verrà riempito con degli spazi. A differenza del char, il varchar invece utilizza solamente lo spazio necessario, richiesto dal valore inserito nel campo più un byte (non sono riuscito a trovare il motivo, ma credo sia il famoso “tappo” in stile C).

Riepilogando quindi:

Valore CHAR(4) Spazio richiesto
VARCHAR(4) Spazio richiesto
'' '    ' 4 bytes '' 1 byte
'ab' 'ab  ' 4 bytes 'ab' 3 bytes
'abcd' 'abcd' 4 bytes 'abcd' 5 bytes
'abcdefgh' 'abcd' 4 bytes 'abcd' 5 bytes

Per finire, come si può vedere nell’ultima riga dell’esempio, per tutti e due i tipi, se il valore supera la lunghezza effettiva dichiarata, esso verrà troncato.

In sostanza se sapete che nel campo che state dichiarando dovrete inserire valori sempre della stessa lunghezza, senza eccezioni, potrebbe essere intelligente dichiararlo char mentre invece se, come succede nella stragrande maggioranza dei casi, il campo che state dichiarando conterrà stringhe generiche, allora vi converrà utilizzare il tipo varchar.

8 Risposte a “Differenze tra il tipo char e il varchar in MySQL”

  1. Bove ha detto:

    Ferre ho risolto! Il mio notebook fa il boot da usb!!!
    Il problema che chrome os non da segni di vita.

    Mi girano le balle perchè tutti i passi della compilazione sono andati bene!

    • davide ha detto:

      sono contento perchè ha suscitato il tuo interesse questo mio post! :-P
      Scherzi a parte è un po’ come era successo a me che avevo ricompilato il kernel di ubuntu e poi non funzionava… quando compili sti progetti così grandi è un terno al lotto riuscire a farli funzionare. Potresti dare un’occhiata ai log del compilatore, ma non sono sicuro che siano human-readable ;-)

      • Bove ha detto:

        Secondo me il mio portatile non va bene..
        Basta un driver che chrome os non riconosce e non partirà mai.
        Mi faccio prestare un netbook e riprovo!

  2. maurizio ha detto:

    Grazie, non conoscevo questo spazio; credo che lo utilizzerò spesso con la speranza di poter dare e non solo prendere. sono un neofita di MySql e mi pare un ottimo strumento di lavoro

    • davide ha detto:

      Ciao, innanzitutto grazie ;-) .
      Per quanto riguarda MySQL invece, è il dbms per eccellenza per il web, se si programma in php. Per quanto ne so, un altro dbms open source e simile a mysql ma superiore in prestazioni e affidabilità è postgresql(anche lui open source e free). Però al momento l’ho testato solo sporadicamente.

  3. Chiara ha detto:

    Ciao!!
    Molto interessante il tuo post, credo proprio che frugherò qua se cerco qualcosa! Mi aiuterai nell’esame di base di dati :D
    Comunque ho commentato perchè non ho capito cosa intendi per “tappo in stile C”.
    In ogni caso la prima cosa che mi viene in mente per quel byte in più è che rappresenti un carattere di fine stringa, è la cosa più sensata; infatti un carattere qualsiasi (compreso il fine stringa) occupa un byte se non sbaglio.
    Ciao!

    • davide ha detto:

      Ciao grazie, mi fa piacere che tornerai sul mio blog ;)

      In ogni caso il carattere “tappo” è proprio quel fine stringa che intendi tu. Se non sbaglio dovrebbe essere lo “\0” che si deve mettere in fondo ad un array.

Lascia un commento