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

MySQL og PHP:UTF-8 med kyrilliske tegn

Du blander API'er her, mysql_* og mysqli_* blander sig ikke. Du bør holde dig til mysqli_ (som det ser ud til at du er), som mysql_* funktioner er forældede og fjernes helt i PHP7.

Dit faktiske problem er et tegnsætproblem et eller andet sted. Her er et par tips, som kan hjælpe dig med at få det rigtige tegnsæt til din applikation. Dette dækker det meste af de generelle problemer, man kan støde på, når man udvikler en PHP/MySQL-applikation.

  • ALLE attributter i hele din ansøgning skal indstilles til UTF-8
  • Gem dokumentet som UTF-8 uden BOM (hvis du bruger Notepad++, er det Format -> Convert to UTF-8 w/o BOM )
  • Headeren i både PHP og HTML skal indstilles til UTF-8

    • HTML (inde i <head></head> tags):

      <meta charset="UTF-8">
      
    • PHP (øverst i din fil, før ethvert output):

      header('Content-Type: text/html; charset=utf-8');
      
  • Når du opretter forbindelse til databasen, skal du indstille tegnsættet til UTF-8 for dit forbindelsesobjekt, sådan her (direkte efter tilslutning)

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

    Dette er for mysqli_* , der er lignende for mysql_* og BOB (se nederst i dette svar).

  • Sørg også for, at din database og tabeller er sat til UTF-8, det kan du gøre sådan her:

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

    (Alle data, der allerede er gemt, vil ikke blive konverteret til det korrekte tegnsæt, så du bliver nødt til at gøre dette med en ren database, eller opdatere dataene efter at have gjort dette, hvis der er ødelagte tegn).

  • Hvis du bruger json_encode() , skal du muligvis anvende JSON_UNESCAPED_UNICODE flag, ellers vil det konvertere specialtegn til deres hexadecimale ækvivalent.

Husk at ALT i hele din pipeline af kode skal indstilles til UFT-8, ellers kan du opleve ødelagte tegn i din applikation.

Ud over denne liste kan der være funktioner, der har en specifik parameter til at specificere et tegnsæt. Manualen vil fortælle dig om dette (et eksempel er htmlspecialchars() ).

Der er også specielle funktioner til multibyte-tegn, f.eks.:strtolower() vil ikke sænke multibyte-tegn, for det skal du bruge mb_strtolower() , se denne live demo .

Bemærkning 1 :Bemærk, at det et sted er noteret som utf-8 (med bindestreg) og et sted som utf8 (uden det). Det er vigtigt, at du ved, hvornår du skal bruge hvilken, da de normalt ikke er udskiftelige. For eksempel ønsker HTML og PHP utf-8 , men det gør MySQL ikke.

Bemærkning 2 :I MySQL er "charset" og "collation" ikke det samme, se Forskel mellem kodning og sortering? . Begge bør dog indstilles til utf-8; generelt bør sortering enten være utf8_general_ci eller utf8_unicode_ci , se UTF-8:Generelt? Beholder? Unicode? .

Bemærkning 3 :Hvis du bruger emojis, skal MySQL angives med en utf8mb4 tegnsæt i stedet for standarden utf8 , både i databasen og forbindelsen. HTML og PHP vil kun have UTF-8 .

Indstilling af UTF-8 med mysql_ og BOB

  • PDO:Dette gøres i dit objekts DSN. Bemærk charset attribut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Dette gøres meget lig mysqli_* , men det tager ikke forbindelsesobjektet som det første argument.

    mysql_set_charset('utf8');
    


  1. Sådan bruges Where-klausulen i Select Statement i SQL Server - SQL Server / TSQL Tutorial Del 109

  2. enkelt fast tabel med flere kolonner vs fleksible abstrakte tabeller

  3. Send flere sæt eller arrays af værdier til en funktion

  4. Konverter BufferedInputStream til billede