Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL und PHP:UTF-8 mit kyrillischen Zeichen

Sie mischen hier APIs, mysql_* und mysqli_* mischt sich nicht. Sie sollten bei mysqli_ bleiben (wie es scheint, sind Sie sowieso), als mysql_* Funktionen sind veraltet und wurden in PHP7 vollständig entfernt.

Ihr eigentliches Problem ist irgendwo ein Zeichensatzproblem. Hier sind ein paar Hinweise, die Ihnen helfen können, den richtigen Zeichensatz für Ihre Anwendung zu finden. Dies deckt die meisten ab der allgemeinen Probleme, mit denen man bei der Entwicklung einer PHP/MySQL-Anwendung konfrontiert werden kann.

  • ALLE -Attribute in Ihrer gesamten Anwendung müssen auf UTF-8 gesetzt sein
  • Speichern Sie das Dokument als UTF-8 ohne BOM (Wenn Sie Notepad++ verwenden, ist es Format -> Convert to UTF-8 w/o BOM )
  • Der Header in PHP und HTML sollte auf UTF-8

    gesetzt sein
    • HTML (innerhalb von <head></head> Tags):

      <meta charset="UTF-8">
      
    • PHP (am Anfang Ihrer Datei, vor jeder Ausgabe):

      header('Content-Type: text/html; charset=utf-8');
      
  • Setzen Sie beim Verbinden mit der Datenbank den Zeichensatz für Ihr Verbindungsobjekt auf UTF-8, wie hier (direkt nach dem Verbinden)

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

    Dies ist für mysqli_* , es gibt ähnliche für mysql_* und PDO (siehe unten in dieser Antwort).

  • Stellen Sie außerdem sicher, dass Ihre Datenbank und Tabellen auf UTF-8 eingestellt sind, das geht so:

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

    (Bereits gespeicherte Daten werden nicht in den richtigen Zeichensatz konvertiert, daher müssen Sie dies mit einer sauberen Datenbank tun oder die Daten danach aktualisieren, wenn fehlerhafte Zeichen vorhanden sind).

  • Wenn Sie json_encode() verwenden , müssen Sie möglicherweise den JSON_UNESCAPED_UNICODE anwenden Flag, andernfalls werden Sonderzeichen in ihre hexadezimale Entsprechung konvertiert.

Denken Sie daran, dass ALLES in Ihrer gesamten Codepipeline muss auf UFT-8 festgelegt werden, da Sie sonst möglicherweise fehlerhafte Zeichen in Ihrer Anwendung feststellen.

Zusätzlich zu dieser Liste kann es Funktionen geben, die einen bestimmten Parameter zur Angabe eines Zeichensatzes haben. Das Handbuch wird Sie darüber informieren (ein Beispiel ist htmlspecialchars()). ).

Es gibt auch spezielle Funktionen für Multibyte-Zeichen, Beispiel:strtolower() wird keine Multibyte-Zeichen verringern, dafür müssen Sie mb_strtolower() verwenden , sehen Sie sich diese Live-Demo an .

Anmerkung 1 :Beachten Sie, dass es irgendwo als utf-8 notiert ist (mit einem Bindestrich) und irgendwo als utf8 (ohne es). Es ist wichtig, dass Sie wissen, wann Sie welche verwenden, da sie normalerweise nicht austauschbar sind. Zum Beispiel wollen HTML und PHP utf-8 , aber MySQL nicht.

Anmerkung 2 :In MySQL ist "charset" und "collation" nicht dasselbe, siehe Unterschied zwischen Encoding und collation? . Beide sollten jedoch auf utf-8 eingestellt sein; Im Allgemeinen sollte die Sortierung entweder utf8_general_ci sein oder utf8_unicode_ci , siehe UTF-8:Allgemein? Behälter? Unicode? .

Anmerkung 3 :Wenn Sie Emojis verwenden, muss MySQL mit einem utf8mb4 angegeben werden charset anstelle des standardmäßigen utf8 , sowohl in der Datenbank als auch in der Verbindung. HTML und PHP haben nur UTF-8 .

Einstellung von UTF-8 mit mysql_ und PDO

  • PDO:Dies geschieht im DSN Ihres Objekts. Beachten Sie den charset Attribut,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Dies geschieht sehr ähnlich zu mysqli_* , aber es nimmt das Verbindungsobjekt nicht als erstes Argument.

    mysql_set_charset('utf8');