SET NAMES utf8 in MySQL?

Lesezeit: 6 Minuten

SET NAMES utf8 in MySQL
Jason Davis

Ich sehe oft etwas Ähnliches unten in PHP-Skripten, die MySQL verwenden

query("SET NAMES utf8");   

Ich musste dies noch nie für ein Projekt tun, daher habe ich ein paar grundlegende Fragen dazu.

  1. Geht das nur mit PDO?
  2. Wenn es sich nicht um eine PDO-spezifische Sache handelt, was ist dann der Zweck, es zu tun? Mir ist klar, dass es die Codierung für MySQL einstellt, aber ich meine, ich musste es nie verwenden, also warum sollte ich es verwenden wollen?

  • “SET NAMES utf8” sollte wegen SQL-Injection vermieden werden. Siehe php.net/manual/en/mysqlinfo.concepts.charset.php für Details.

    – masakielastisch

    8. Juni 2013 um 11:51 Uhr

  • @masakielastic Ich sehe nicht, wo das Setzen von ‘set names utf8’ eine Bedrohung für die SQL-Injektion darstellt? Verwenden Sie die richtige MySQL-API, wo ist der Thread?

    – Breitband

    29. August 2013 um 7:20 Uhr

  • Sorry für meine Unfreundlichkeit. Siehe die Antwort von ircmaxell: stackoverflow.com/a/12118602/531320 Obwohl “SET NAMES” kein Problem hat, solange UTF-8 verwendet wird, ist die Möglichkeit, dass Sie in Zukunft GBK oder Big5 (Chinesisch) oder Shift_JIS (Japanisch) verwenden werden, unbestreitbar .

    – masakielastisch

    29. August 2013 um 8:02 Uhr

SET NAMES utf8 in MySQL
Vinko Vrsalović

Es wird immer dann benötigt, wenn Sie Daten an den Server senden möchten, die Zeichen enthalten, die nicht in reinem ASCII dargestellt werden können, wie z. B. ‘ñ’ oder ‘ö’.

Dass, wenn die MySQL-Instanz nicht so konfiguriert ist, dass sie standardmäßig UTF-8-Codierung von Client-Verbindungen erwartet (viele sind es, abhängig von Ihrem Standort und Ihrer Plattform).

Lesen http://www.joelonsoftware.com/articles/Unicode.html falls Sie nicht wissen, wie Unicode funktioniert.

Lesen Sie, ob „SET NAMES“ verwendet werden soll, um Alternativen zu SET NAMES zu sehen und worum es genau geht.

  • ‘ö’ und ‘ñ’ sind erweitertes ASCII. Müsste man noch SET NAMES UTF8 für Sie?

    – Tim

    26. Juni 2011 um 7:12 Uhr


  • Ich habe festgestellt, dass ich oft utf8_decode($my_text) hinzufügen muss; in PHP, damit spezielle UTF-8-Zeichen auf Websites korrekt angezeigt werden, wenn die Daten von MySQL abgefragt werden. Meine Tabellen und Spalten sind in MySQL auf UTF-8 gesetzt – sollte das also notwendig sein?

    – NexusRex

    30. August 2011 um 19:15 Uhr

  • @ Vinko Vrsalovic: Nicht unbedingt … Ich hatte alle meine Dateien in utf8, aber bei meinem vorherigen Hoster war der mysql-Zeichensatz auf latin1 eingestellt, und weil ich mysql nicht gesagt habe, dass ich Zeichen in utf8 sende (daher Satznamen utf8), wurden sie gespeichert im lateinischen Zeichensatz und alle meine Sonderzeichen (slowenisch čšž) sahen aus, als wären sie von einem Auto überrollt worden – noch etwas: Wenn Sie in phpmyadmin suchen, werden Sie keine Ergebnisse finden, weil ein č wie ein Å ist und so weiter

    – Erik Čerpnjak

    23. Juni 2015 um 13:40 Uhr

  • Beachten Sie, dass es auch den Zeichensatz angibt, den der Server zum Zurücksenden von Ergebnissen an den Client verwenden soll, also auch beim Empfangen dieser Daten benötigt wird, z. B. mit a SELECT Aussage.

    – Leopoldo Sanczyk

    20. November 2015 um 20:54 Uhr


  • @ Tim. Es gibt nicht wirklich so etwas wie “erweitertes ASCII”. Es gibt eine ganze Reihe verschiedener Codierungen, die alle als erweitertes ASCII bezeichnet werden können (jeder Einzelbyte-Zeichensatz, bei dem die erste Hälfte mit ASCII identisch ist, und davon gibt es jede Menge).

    – TRIG

    11. Februar 2020 um 14:33 Uhr

Von dem Handbuch:

SET NAMES gibt an, welchen Zeichensatz der Client verwendet, um SQL-Anweisungen an den Server zu senden.

Ausführlicher (und wieder einmal unentgeltlich aus dem Handbuch):

SET NAMES gibt an, welchen Zeichensatz der Client verwendet, um SQL-Anweisungen an den Server zu senden. Somit teilt SET NAMES ‘cp1251’ dem Server mit: “Zukünftig eingehende Nachrichten von diesem Client haben den Zeichensatz cp1251.” Es gibt auch den Zeichensatz an, den der Server zum Zurücksenden von Ergebnissen an den Client verwenden soll. (Zum Beispiel gibt es an, welcher Zeichensatz für Spaltenwerte verwendet werden soll, wenn Sie eine SELECT-Anweisung verwenden.)

  • Ich liebe dich. Habe mir gerade den Abend versüßt!

    – karim79

    25. Juli 2012 um 20:48 Uhr

SET NAMES utf8 in MySQL
Ondra Žižka

Die richtige Codierung ist wirklich schwierig – es gibt zu viele Ebenen:

  • Browser
  • Buchseite
  • PHP
  • MySQL

Der SQL-Befehl „SET CHARSET utf8“ von PHP sorgt dafür, dass die Client-Seite (PHP) die Daten in utf8 erhält, egal wie sie in der Datenbank gespeichert sind. Natürlich müssen sie vorher richtig gelagert werden.

DDL-Definition im Vergleich zu echten Daten

Die für eine Tabelle/Spalte definierte Kodierung bedeutet nicht wirklich, dass die Daten in dieser Kodierung vorliegen. Wenn Sie zufällig eine Tabelle haben, die als definiert ist utf8 aber als andere Kodierung gespeichert, dann behandelt MySQL sie so utf8 und du bist in Schwierigkeiten. Das bedeutet, dass Sie dies zuerst beheben müssen.

Was zu überprüfen

Sie müssen überprüfen, in welcher Codierung der Datenfluss auf jeder Ebene erfolgt.

  • Überprüfen Sie HTTP-Header, Header.
  • Überprüfen Sie, was wirklich im Text der Anfrage gesendet wird.
  • Vergessen Sie nicht, dass MySQL fast überall codiert ist:
    • Datenbank
    • Tische
    • Säulen
    • Server als Ganzes
    • Klient
      Sorgen Sie dafür, dass überall das Richtige dabei ist.

Wandlung

Wenn Sie Daten in zB windows-1250und speichern möchten utf-8dann verwenden Sie diese SQL vor dem Speichern:

SET NAMES 'cp1250';

Wenn Sie Daten in DB als haben windows-1250 und zurückholen wollen utf8verwenden:

SET CHARSET 'utf8';

Noch ein paar Anmerkungen:

  • Verlassen Sie sich nicht auf zu “intelligente” Tools, um die Daten anzuzeigen. ZB kodiert phpMyAdmin wirklich schlecht (was ich tat, als ich es benutzte). Und es geht durch alle Schichten, also ist es schwer herauszufinden.
  • Außerdem hatte der Internet Explorer ein wirklich dummes Verhalten, die Codierung auf der Grundlage seltsamer Regeln zu “erraten”.
  • Verwenden Sie einfache Editoren, in denen Sie die Codierung wechseln können. Ich empfehle MySQL-Workbench.

1646831058 628 SET NAMES utf8 in MySQL
Usama Sulaiman

Diese Abfrage sollte vor der Abfrage geschrieben werden, die Daten in der Datenbank erstellt oder aktualisiert, diese Abfrage sieht folgendermaßen aus:

mysql_query("set names 'utf8'");

Beachten Sie, dass Sie die Codierung, die Sie verwenden, in den Header schreiben sollten, zum Beispiel, wenn Sie utf-8 verwenden, fügen Sie es so in den Header ein, oder es verursacht ein Problem mit Internet Explorer

Ihre Seite sieht also so aus

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
</html>

Die Lösung ist

 $conn->set_charset("utf8");

1646831059 449 SET NAMES utf8 in MySQL
Benutzer1783273

Anstatt dies über eine SQL-Abfrage zu tun, verwenden Sie die PHP-Funktion: mysqli::set_charset mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

Weitere Informationen finden Sie im Abschnitt MySQL-Zeichensatzkonzepte.

von http://www.php.net/manual/en/mysqli.set-charset.php

1646831060 338 SET NAMES utf8 in MySQL
Benutzer3162905

Danke @all!

nicht verwenden: query(“SET NAMES utf8”); Dies ist Setup-Zeug und keine Abfrage. Setzen Sie es direkt nach einem Verbindungsstart mit setCharset() (oder einer ähnlichen Methode)

eine Kleinigkeit in Praxis:

Status:

  • MySQL-Server spricht standardmäßig latin1
  • Ihre ganze App ist in utf8
  • Verbindung wird ohne Extras hergestellt (also: latin1) (keine SET NAMES utf8 …, keine set_charset() Methode/Funktion)

Das Speichern und Lesen von Daten ist kein Problem, solange mysql die Zeichen verarbeiten kann. Wenn Sie in die DB schauen, werden Sie bereits sehen, dass darin Mist ist (z. B. mit phpmyadmin).

bis jetzt ist das kein Problem! (falsch, funktioniert aber oft (in Europa)) ..

..es sei denn, ein anderer Client/Programm oder eine geänderte Bibliothek, die korrekt funktioniert, wird Daten lesen/speichern. dann sind Sie in großen Schwierigkeiten!

982540cookie-checkSET NAMES utf8 in MySQL?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy