sql >> Databasteknik >  >> RDS >> Mysql

MySQL och PHP:UTF-8 med kyrilliska tecken

Du blandar API:er här, mysql_* och mysqli_* blandas inte. Du bör hålla dig till mysqli_ (som du verkar vara i alla fall), som mysql_* funktioner är utfasade och tas bort helt i PHP7.

Ditt faktiska problem är ett teckenuppsättningsproblem någonstans. Här är några tips som kan hjälpa dig att få rätt teckenuppsättning för din applikation. Detta täcker det mesta av de allmänna problem man kan möta när man utvecklar en PHP/MySQL-applikation.

  • ALLA attribut i hela din ansökan måste ställas in på UTF-8
  • Spara dokumentet som UTF-8 utan BOM (om du använder Notepad++ är det Format -> Convert to UTF-8 w/o BOM )
  • Rubriken i både PHP och HTML bör ställas in på UTF-8

    • HTML (inuti <head></head> taggar):

      <meta charset="UTF-8">
      
    • PHP (högst upp i filen, före någon utdata):

      header('Content-Type: text/html; charset=utf-8');
      
  • När du ansluter till databasen, ställ in teckenuppsättningen till UTF-8 för ditt anslutningsobjekt, så här (direkt efter anslutning)

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

    Detta är för mysqli_* , det finns liknande för mysql_* och PDO (se längst ner i detta svar).

  • Se också till att din databas och tabeller är inställda på UTF-8, du kan göra det så här:

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

    (All data som redan lagrats kommer inte att konverteras till rätt teckenuppsättning, så du måste göra detta med en ren databas, eller uppdatera data efter att ha gjort detta om det finns trasiga tecken).

  • Om du använder json_encode() , kan du behöva använda JSON_UNESCAPED_UNICODE flagga, annars konverterar den specialtecken till deras hexadecimala motsvarighet.

Kom ihåg att ALLT i hela din pipeline av kod måste ställas in på UFT-8, annars kan du uppleva trasiga tecken i din applikation.

Utöver den här listan kan det finnas funktioner som har en specifik parameter för att specificera en teckenuppsättning. Manualen kommer att berätta om detta (ett exempel är htmlspecialchars() ).

Det finns också specialfunktioner för multibyte-tecken, till exempel:strtolower() kommer inte att sänka multibyte-tecken, för det måste du använda mb_strtolower() , se denna live-demon .

Anmärkning 1 :Lägg märke till att det någonstans noterats som utf-8 (med ett bindestreck), och någonstans som utf8 (utan det). Det är viktigt att du vet när du ska använda vilka, eftersom de vanligtvis inte är utbytbara. Till exempel vill HTML och PHP ha utf-8 , men MySQL gör det inte.

Anmärkning 2 :I MySQL är "charset" och "kollation" inte samma sak, se Skillnaden mellan kodning och sortering? . Båda bör dock ställas in på utf-8; i allmänhet bör sortering vara antingen utf8_general_ci eller utf8_unicode_ci , se UTF-8:Allmänt? Bin? Unicode? .

Anmärkning 3 :Om du använder emojis måste MySQL anges med en utf8mb4 teckenuppsättning istället för standarden utf8 , både i databasen och anslutningen. HTML och PHP kommer bara att ha UTF-8 .

Ställa in UTF-8 med mysql_ och SUB

  • PDO:Detta görs i DSN för ditt objekt. Notera charset attribut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Detta görs mycket likt mysqli_* , men det tar inte anslutningsobjektet som det första argumentet.

    mysql_set_charset('utf8');
    


  1. Arbeta kring missade optimeringar

  2. Hur man får gårdagens datum i Oracle

  3. Likheter och skillnader mellan funktionerna RANK, DENSE_RANK och ROW_NUMBER

  4. Hur man ställer in MariaDB 10.3-replikering med Ansible och Vagrant