Ich sehe oft etwas Ähnliches in PHP Skripts, die MySQL verwenden
query("SET NAMES utf8");
Ich musste das noch nie für ein Projekt machen, daher habe ich ein paar grundlegende Fragen dazu.
Dies ist immer dann erforderlich, wenn Sie Daten an den Server senden möchten, deren Zeichen nicht in reinem ASCII-Format dargestellt werden können, wie 'ñ' oder 'ö'.
Wenn die MySQL-Instanz nicht so konfiguriert ist, dass sie standardmäßig eine UTF-8-Codierung von Client-Verbindungen erwartet (viele davon abhängig von Ihrem Standort und Ihrer Plattform.)
Lesen Sie http://www.joelonsoftware.com/articles/Unicode.html falls Sie nicht wissen, wie Unicode funktioniert.
Lesen Gibt an, ob "SET NAMES" verwendet werden soll , um die SET NAMES-Alternativen anzuzeigen und worum es sich genau handelt.
Aus dem Handbuch :
SET NAMES gibt an, welcher Zeichensatz Der Client verwendet zum Senden von SQL Anweisungen an den Server.
Ausführlicher (und wieder einmal aus dem manual abgehoben):
SET NAMES gibt an, welcher Zeichensatz Der Client verwendet zum Senden von SQL Anweisungen an den Server. SET NAMES 'cp1251' teilt dem Server mit „Zukünftige eingehende Nachrichten von diesem Client ist im Zeichensatz cp1251. ” Es gibt auch den Zeichensatz an die der Server zum Senden verwenden soll Ergebnisse an den Kunden zurück. (Für Beispiel wird angegeben, welches Zeichen Für Spaltenwerte verwendet werden soll, wenn Sie eine SELECT-Anweisung Verwenden.)
Das richtige Kodieren ist wirklich schwierig - es gibt zu viele Ebenen:
Der SQL-Befehl "SET CHARSET utf8" von PHP stellt sicher, dass der Client (PHP) die Daten in utf8 erhält, unabhängig davon, wie sie in der Datenbank gespeichert sind. Natürlich müssen sie zuerst korrekt gespeichert werden.
Die für eine Tabelle/Spalte definierte Kodierung bedeutet nicht wirklich, dass sich die Daten in dieser Kodierung befinden. Wenn Sie eine Tabelle als utf8
definiert haben, die jedoch als unterschiedliche Kodierung gespeichert ist, behandelt MySQL diese als utf8
und Sie haben Probleme. Was bedeutet, dass Sie das zuerst beheben müssen.
Sie müssen überprüfen, in welcher Kodierung der Datenfluss auf jeder Ebene vorliegt.
Wenn Sie Daten erhalten, z. windows-1250
und möchte in utf-8
speichern. Verwenden Sie dann diese SQL, bevor Sie speichern:
SET NAMES 'cp1250';
Wenn Sie Daten in der Datenbank als windows-1250
haben und utf8
zurückholen möchten, verwenden Sie:
SET CHARSET 'utf8';
Verlassen Sie sich nicht auf zu "intelligente" Werkzeuge, um die Daten anzuzeigen. Z.B. phpMyAdmin macht das Kodieren wirklich schlecht. Und es geht durch alle Schichten hindurch, so dass es schwer herauszufinden ist. Internet Explorer hatte auch wirklich dummes Verhalten, die Kodierung basierend auf seltsamen Regeln zu "erraten". Verwenden Sie einfache Editoren, in denen Sie die Kodierung wechseln können. Ich empfehle auch MySQL Workbench.
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 von Ihnen verwendete Codierung in den Header schreiben sollten. Wenn Sie beispielsweise utf-8 verwenden, fügen Sie es wie folgt in den Header ein, oder es wird ein Problem mit Internet Explorer verursacht
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");
Verwenden Sie statt über eine SQL-Abfrage 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.
Vielen Dank!
verwenden Sie nicht: Abfrage ("SET NAMES utf8"); Dies ist Setup-Sachen und keine Abfrage. lege es nach einer Verbindung richtig an und beginne mit setCharset () (oder einer ähnlichen Methode)
eine kleine Sache in der Praxis:
status:
Das Speichern und Lesen von Daten ist kein Problem, da mysql die Zeichen verarbeiten kann. Wenn Sie in die Datenbank schauen, werden Sie bereits sehen, dass sich darin Mist befindet (z. B. phpmyadmin).
bis jetzt ist das kein problem! (falsch aber funktioniert oft (in europa)) ..
..wenn ein anderer Client/ein anderes Programm oder eine geänderte Bibliothek, die korrekt arbeitet, Daten lesen/speichern kann. dann bist du in großen Schwierigkeiten!
Nicht nur PDO. Wenn SQL wie "????" Symbole, voreingestellt von Ihnen Zeichensatz (hoffe UTF-8) wirklich empfohlen:
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
oder über den Prozedurstil mysqli_set_charset($db,"utf8")