Mysql
 sql >> Database >  >> RDS >> Mysql

UTF-8 fino in fondo

Archiviazione dati :

  • Specificare il utf8mb4 set di caratteri su tutte le tabelle e colonne di testo nel database. Ciò fa sì che MySQL memorizzi e recuperi fisicamente i valori codificati in modo nativo in UTF-8. Nota che MySQL utilizzerà implicitamente utf8mb4 codifica se un utf8mb4_* le regole di confronto sono specificate (senza alcun set di caratteri esplicito).

  • Nelle versioni precedenti di MySQL (<5.5.3), sfortunatamente sarai costretto a usare semplicemente utf8 , che supporta solo un sottoinsieme di caratteri Unicode. Vorrei scherzare.

Accesso ai dati :

  • Nel codice dell'applicazione (ad es. PHP), in qualsiasi metodo di accesso al DB che utilizzi, dovrai impostare il set di caratteri di connessione su utf8mb4 . In questo modo, MySQL non esegue conversioni dal suo UTF-8 nativo quando trasferisce i dati all'applicazione e viceversa.

  • Alcuni driver forniscono il proprio meccanismo per configurare il set di caratteri di connessione, che aggiorna il proprio stato interno e informa MySQL della codifica da utilizzare sulla connessione:questo è solitamente l'approccio preferito. In PHP:

    • Se stai utilizzando il DOP livello di astrazione con PHP ≥ 5.3.6, puoi specificare charset nel DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Se stai usando mysqli , puoi chiamare set_charset() :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Se sei bloccato con il semplice mysql ma è in esecuzione PHP ≥ 5.2.3, puoi chiamare mysql_set_charset .

  • Se il driver non fornisce il proprio meccanismo per impostare il set di caratteri di connessione, potrebbe essere necessario inviare una query per dire a MySQL come la tua applicazione prevede che i dati sulla connessione vengano codificati:SET NAMES 'utf8mb4' .

  • La stessa considerazione su utf8mb4 /utf8 si applica come sopra.

Risultato :

  • Se la tua applicazione trasmette testo ad altri sistemi, anche loro dovranno essere informati della codifica dei caratteri. Con le applicazioni web, il browser deve essere informato della codifica in cui vengono inviati i dati (tramite intestazioni di risposta HTTP o metadati HTML ).

  • In PHP, puoi usare default_charset php.ini oppure emetti manualmente il Content-Type Intestazione MIME tu stesso, che è solo più lavoro ma ha lo stesso effetto.

  • Quando si codifica l'output usando json_encode() , aggiungi JSON_UNESCAPED_UNICODE come secondo parametro.

Inserimento :

  • Sfortunatamente, dovresti verificare che ogni stringa ricevuta sia UTF-8 valida prima di provare a memorizzarla o usarla ovunque. mb_check_encoding() di PHP fa il trucco, ma devi usarlo religiosamente. Non c'è davvero modo di aggirare questo problema, poiché i client dannosi possono inviare dati con la codifica che desiderano e non ho trovato un trucco per convincere PHP a farlo per te in modo affidabile.

  • Dalla mia lettura delle attuali specifiche HTML , i seguenti sotto-punti elenco non sono più necessari o addirittura validi per l'HTML moderno. La mia comprensione è che i browser lavoreranno e invieranno dati nel set di caratteri specificato per il documento. Tuttavia, se stai prendendo di mira versioni precedenti di HTML (XHTML, HTML4, ecc.), questi punti potrebbero comunque essere utili:

    • Solo per HTML prima di HTML5 :vuoi che tutti i dati che ti vengono inviati dai browser siano in UTF-8. Sfortunatamente, se segui l'unico modo per farlo in modo affidabile è aggiungere il accept-charset attribuire a tutti i tuoi
      tag: .
    • Solo per HTML prima di HTML5 :nota che le specifiche HTML del W3C dicono che i client "dovrebbero" inviare i moduli per impostazione predefinita al server in qualsiasi set di caratteri servito dal server, ma questa è apparentemente solo una raccomandazione, da qui la necessità di essere espliciti su ogni singolo tag.

Altre considerazioni sul codice :

  • Ovviamente, tutti i file che servirai (PHP, HTML, JavaScript, ecc.) dovrebbero essere codificati in UTF-8 valido.

  • Devi assicurarti che ogni volta che elabori una stringa UTF-8, lo faccia in modo sicuro. Questa è, purtroppo, la parte difficile. Probabilmente vorrai fare un uso estensivo di mbstring estensione.

  • Le operazioni sulle stringhe integrate in PHP non per impostazione predefinita, sicuro UTF-8. Ci sono alcune cose che puoi fare in sicurezza con le normali operazioni sulle stringhe PHP (come la concatenazione), ma per la maggior parte delle cose dovresti usare l'equivalente mbstring funzione.

  • Per sapere cosa stai facendo (leggi:non rovinare tutto), devi davvero conoscere UTF-8 e come funziona al livello più basso possibile. Dai un'occhiata ai link da utf8.com per alcune buone risorse per imparare tutto ciò che devi sapere.