Originariamente inviato da }gu|do[z]{®©
dove posso documentarmi meglio?
Ovunque, più o meno, da wiki in poi.

Comunque, ti faccio uno schemino veloce:
- byte != carattere
Ogni carattere dentro il computer ha una certa rappresentazione in bit (come ogni informazione digitale). Lo stesso carattare, in diversi charset ( = set di caratteri) può avere rappresentazioni binarie differenti. Queste rappresentazioni possono occupare sempre un solo byte (come nell'ISO-8859-1) oppure più byte, come ad esempio in UTF-8.
- per agire bene deve esserci concordanza tra charset usato in memorizzazione e charset usato in visualizzazione. Memorizzazione significa anche salvare i sorgenti con il giusto charset affinché le costanti stringa siano interpretate correttamente, non solo nel database.
Quindi se hai un file HTML in iso-8859-1, hai voglia a settare il browser in UTF-8, non basta quello per cambiare il suo charset, così come non basta dichiarare un metatag "utf-8" o un header HTTP analogo per rendere quel documento realmente in utf-8. Ci deve essere concordanza in tutti questi aspetti.
- quasi tutte le funzioni di manipolazione delle stringhe di PHP < 6 non funzionano su charset multibyte, (UTF-8 è multibyte), ma esistono librerie ed estensioni per risolvere questo problema.
- il collation riguarda l'ordinamento alfabetico delle stringhe. Ad esempio in Germania, dove vi sono più caratteri rispetto all'alfabeto latino standard, anche l'ordinamento alfabetico cambia di conseguenza. Quindi il collation da specificare in MySQL serve appunto ad ottenere un corretto ordinamento dei risultati testuali nelle query. In genere è molto semplice, perché c'è un collation di default per ogni charset. Quindi se usi UTF-8 come charset ti basta prendere il collation UTF-8 case insensitive e sei a posto.

Dubbi, perplessità?