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

UTF-8 durchgängig

Datenspeicherung :

  • Geben Sie utf8mb4 an Zeichensatz für alle Tabellen und Textspalten in Ihrer Datenbank. Dadurch speichert und ruft MySQL nativ in UTF-8 codierte Werte physisch ab. Beachten Sie, dass MySQL implizit utf8mb4 verwendet Codierung, wenn ein utf8mb4_* Sortierung ist angegeben (ohne expliziten Zeichensatz).

  • In älteren Versionen von MySQL (<5.5.3) werden Sie leider gezwungen sein, einfach utf8 zu verwenden , die nur eine Teilmenge von Unicode-Zeichen unterstützt. Ich wünschte, ich mache Witze.

Datenzugriff :

  • In Ihrem Anwendungscode (z. B. PHP) müssen Sie bei jeder DB-Zugriffsmethode, die Sie verwenden, den Verbindungszeichensatz auf utf8mb4 setzen . Auf diese Weise führt MySQL keine Konvertierung von seinem nativen UTF-8 durch, wenn es Daten an Ihre Anwendung weitergibt und umgekehrt.

  • Einige Treiber bieten ihren eigenen Mechanismus zum Konfigurieren des Verbindungszeichensatzes, der sowohl seinen eigenen internen Zustand aktualisiert als auch MySQL über die für die Verbindung zu verwendende Kodierung informiert – dies ist normalerweise der bevorzugte Ansatz. In PHP:

    • Wenn Sie das PDO verwenden Abstraktionsschicht mit PHP ≥ 5.3.6 können Sie charset angeben im DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Wenn Sie mysqli verwenden , können Sie set_charset() aufrufen :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Wenn Sie mit einfachem mysql nicht weiterkommen aber zufällig PHP ≥ 5.2.3 ausführen, können Sie mysql_set_charset .

  • Wenn der Treiber keinen eigenen Mechanismus zum Festlegen des Verbindungszeichensatzes bereitstellt, müssen Sie MySQL möglicherweise mit einer Abfrage mitteilen, wie Ihre Anwendung Daten auf der Verbindung erwartet, die codiert werden sollen:SET NAMES 'utf8mb4' .

  • Die gleiche Überlegung bezüglich utf8mb4 /utf8 gilt wie oben.

Ausgabe :

  • Wenn Ihre Anwendung Text an andere Systeme übermittelt, müssen diese ebenfalls über die Zeichenkodierung informiert werden. Bei Webanwendungen muss dem Browser mitgeteilt werden, in welcher Kodierung Daten gesendet werden (über HTTP-Response-Header oder HTML-Metadaten ).

  • In PHP können Sie den default_charset verwenden php.ini-Option oder geben Sie den Content-Type manuell ein MIME-Header selbst, was nur mehr Arbeit ist, aber den gleichen Effekt hat.

  • Beim Codieren der Ausgabe mit json_encode() , fügen Sie JSON_UNESCAPED_UNICODE hinzu als zweiten Parameter.

Eingabe :

  • Leider sollten Sie jede empfangene Zeichenfolge auf gültiges UTF-8 überprüfen, bevor Sie versuchen, sie zu speichern oder irgendwo zu verwenden. PHPs mb_check_encoding() macht den Trick, aber Sie müssen es religiös verwenden. Daran führt wirklich kein Weg vorbei, da böswillige Clients Daten in beliebiger Codierung übermitteln können, und ich habe keinen Trick gefunden, um PHP dazu zu bringen, dies zuverlässig für Sie zu tun.

  • Aus meiner Lektüre der aktuellen HTML-Spezifikation , sind die folgenden Unterpunkte für modernes HTML nicht mehr erforderlich oder sogar gültig. Mein Verständnis ist, dass Browser mit dem für das Dokument angegebenen Zeichensatz arbeiten und Daten in diesem übermitteln. Wenn Sie jedoch auf ältere HTML-Versionen (XHTML, HTML4 usw.) abzielen, können diese Punkte dennoch nützlich sein:

    • Nur für HTML vor HTML5 :Sie möchten, dass alle Daten, die Ihnen von Browsern gesendet werden, in UTF-8 vorliegen. Leider ist die einzige Möglichkeit, dies zuverlässig zu tun, das Hinzufügen des accept-charset Attribut für alle Ihre
      Tags: .
    • Nur für HTML vor HTML5 :Beachten Sie, dass die W3C-HTML-Spezifikation besagt, dass Clients standardmäßig Formulare in dem vom Server bereitgestellten Zeichensatz an den Server zurücksenden "sollten", aber dies ist anscheinend nur eine Empfehlung, daher die Notwendigkeit, bei jedem einzelnen Tag.

Weitere Überlegungen zum Kodex :

  • Offensichtlich sollten alle Dateien, die Sie bereitstellen (PHP, HTML, JavaScript usw.), in gültigem UTF-8 codiert sein.

  • Sie müssen sicherstellen, dass Sie jedes Mal, wenn Sie eine UTF-8-Zeichenfolge verarbeiten, dies sicher tun. Das ist leider der schwierige Teil. Wahrscheinlich möchten Sie ausgiebig Gebrauch von mbstring Erweiterung.

  • Die in PHP integrierten Zeichenfolgenoperationen sind nicht standardmäßig UTF-8 sicher. Es gibt einige Dinge, die Sie sicher mit normalen PHP-String-Operationen tun können (wie Verkettung), aber für die meisten Dinge sollten Sie den entsprechenden mbstring verwenden Funktion.

  • Um zu wissen, was Sie tun (sprich:es nicht vermasseln), müssen Sie UTF-8 wirklich kennen und wissen, wie es auf der niedrigstmöglichen Ebene funktioniert. Schauen Sie sich einen der Links von utf8.com an für einige gute Ressourcen, um alles zu lernen, was Sie wissen müssen.