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

MySQL e PHP:UTF-8 con caratteri cirillici

Stai mescolando le API qui, mysql_* e mysqli_* non si mescola. Dovresti restare con mysqli_ (come sembra che tu sia comunque), come mysql_* le funzioni sono deprecate e rimosse completamente in PHP7.

Il tuo vero problema è un problema di set di caratteri da qualche parte. Ecco alcuni suggerimenti che possono aiutarti a ottenere il set di caratteri giusto per la tua applicazione. Questo copre la maggior parte dei problemi generali che si possono incontrare quando si sviluppa un'applicazione PHP/MySQL.

  • TUTTI gli attributi in tutta l'applicazione devono essere impostati su UTF-8
  • Salva il documento come UTF-8 senza BOM (se stai usando Notepad++, è Format -> Convert to UTF-8 w/o BOM )
  • L'intestazione sia in PHP che in HTML dovrebbe essere impostata su UTF-8

    • HTML (all'interno di <head></head> tag):

      <meta charset="UTF-8">
      
    • PHP (nella parte superiore del file, prima di qualsiasi output):

      header('Content-Type: text/html; charset=utf-8');
      
  • Dopo esserti connesso al database, imposta il set di caratteri su UTF-8 per il tuo oggetto di connessione, in questo modo (direttamente dopo la connessione)

    mysqli_set_charset($conn, "utf8"); /* Procedural approach */
    $conn->set_charset("utf8");        /* Object-oriented approach */
    

    Questo è per mysqli_* , ce ne sono di simili per mysql_* e PDO (vedi in fondo a questa risposta).

  • Assicurati inoltre che il database e le tabelle siano impostati su UTF-8, puoi farlo in questo modo:

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    (Tutti i dati già archiviati non verranno convertiti nel set di caratteri corretto, quindi dovrai farlo con un database pulito o aggiornare i dati dopo averlo fatto se ci sono caratteri interrotti).

  • Se stai usando json_encode() , potrebbe essere necessario applicare il JSON_UNESCAPED_UNICODE flag, altrimenti convertirà i caratteri speciali nel loro equivalente esadecimale.

Ricorda che TUTTO nell'intera pipeline di codice deve essere impostato su UFT-8, altrimenti potresti riscontrare caratteri interrotti nella tua applicazione.

Oltre a questo elenco, potrebbero esserci funzioni che dispongono di un parametro specifico per specificare un set di caratteri. Il manuale ti parlerà di questo (un esempio è htmlspecialchars() ).

Ci sono anche funzioni speciali per i caratteri multibyte, ad esempio:strtolower() non abbasserà i caratteri multibyte, per questo dovrai usare mb_strtolower() , guarda questa dimostrazione dal vivo .

Nota 1 :Nota che è da qualche parte indicato come utf-8 (con un trattino) e da qualche parte come utf8 (Senza esso). È importante sapere quando usarli, poiché di solito non sono intercambiabili. Ad esempio, HTML e PHP vogliono utf-8 , ma MySQL no.

Nota 2 :In MySQL, "charset" e "collation" non sono la stessa cosa, vedi Differenza tra codifica e confronto? . Tuttavia, entrambi dovrebbero essere impostati su utf-8; generalmente le regole di confronto dovrebbero essere utf8_general_ci o utf8_unicode_ci , vedi UTF-8:Generale? Bidone? Unicode? .

Nota 3 :Se stai usando emoji, MySQL deve essere specificato con un utf8mb4 charset invece dello standard utf8 , sia nel database che nella connessione. HTML e PHP avranno solo UTF-8 .

Impostazione UTF-8 con mysql_ e DOP

  • PDO:questo viene fatto nel DSN del tuo oggetto. Nota il charset attributo,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Questo è fatto in modo molto simile a mysqli_* , ma non prende il connection-object come primo argomento.

    mysql_set_charset('utf8');