
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.
- Geht das nur mit PDO?
- 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?

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.
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.)

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-1250
und speichern möchten utf-8
dann verwenden Sie diese SQL vor dem Speichern:
SET NAMES 'cp1250';
Wenn Sie Daten in DB als haben windows-1250
und zurückholen wollen utf8
verwenden:
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.

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");

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

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!
9825400cookie-checkSET NAMES utf8 in MySQL?yes
“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