MySQL und PHP: UTF-8 mit kyrillischen Zeichen [duplicate]
Lesezeit: 4 Minuten
Arriba
Ich versuche, einen kyrillischen Wert in die MySQL-Tabelle einzufügen, aber es gibt ein Problem mit der Codierung.
PHP:
<?php
$servername = "localhost";
$username = "a";
$password = "b";
$dbname = "c";
$conn = new mysqli($servername, $username, $password, $dbname);
mysql_query("SET NAMES 'utf8';");
mysql_query("SET CHARACTER SET 'utf8';");
mysql_query("SET SESSION collation_connection = 'utf8_general_ci';");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "UPDATE `c`.`mainp` SET `search` = 'test тест' WHERE `mainp`.`id` =1;";
if ($conn->query($sql) === TRUE) {
}
$conn->close();
?>
MySQL:
| id | search |
| 1 | test ав |
Hinweis: PHP-Datei ist utf-8Datenbankabgleich utf8_general_ci
Sie müssen aufhören zu verwenden mysql_query() — PHPs mysql_xxx() Funktionen wurden ersetzt: Sie sollten entweder die verwenden mysqli oder PDO Bibliotheken statt. Beide sollten es einfacher machen, mit solchen Dingen zu arbeiten.
– Spudley
8. August 2015 um 20:07 Uhr
Sollte auch für Sie die Lösung sein stackoverflow.com/questions/25286279/…
– Narr
8. August 2015 um 20:21 Uhr
Qirel
Sie mischen hier APIs, mysql_* und mysqli_* mischt sich nicht. Du solltest dabei bleiben mysqli_ (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 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 festgelegt 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 <head></head> Stichworte):
<meta charset="UTF-8">
PHP (am Anfang Ihrer Datei, vor jeder Ausgabe):
header('Content-Type: text/html; charset=utf-8');
Stellen Sie beim Verbinden mit der Datenbank den Zeichensatz für Ihr Verbindungsobjekt auf UTF-8, wie hier (direkt nach dem Verbinden)
Das 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 können Sie folgendermaßen tun:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(Alle bereits gespeicherten 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 verwenden json_encode()müssen Sie möglicherweise die anwenden JSON_UNESCAPED_UNICODE Flag, andernfalls werden Sonderzeichen in ihre hexadezimale Entsprechung konvertiert.
Erinnere dich daran 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 senken, dafür müssen Sie verwenden mb_strtolower()Sieh dir das an Live-Demo.
Anmerkung 1: Beachten Sie, dass es irgendwo als angegeben ist utf-8 (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 HTML und PHP will utf-8aber MySQL nicht.
Anmerkung 2: In MySQL sind “Zeichensatz” und “Kollation” nicht dasselbe, siehe Unterschied zwischen Kodierung und Kollation?. Beide sollten jedoch auf utf-8 eingestellt sein; Im Allgemeinen sollte die Sortierung beides sein utf8_general_ci oder utf8_unicode_ci, siehe UTF-8: Allgemein? Behälter? Unicode?.
Notiz 3: Wenn Sie Emojis verwenden, muss MySQL mit einem angegeben werden utf8mb4 Zeichensatz anstelle des Standards utf8, sowohl in der Datenbank als auch in der Verbindung. HTML und PHP werden nur haben UTF-8.
UTF-8 einstellen mit mysql_ und PDO
PDO: Dies geschieht im DSN Ihres Objekts. Beachten Sie das charset Attribut,
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
mysql_: Dies ist sehr ähnlich wie getan mysqli_*aber es nimmt das Verbindungsobjekt nicht als erstes Argument.
mysql_set_charset('utf8');
Das war die Antwort für mich: $conn->set_charset(“utf8”); Danke!!
– nurp
9. April 2016 um 11:43 Uhr
Charset kann jetzt mit gesetzt werden <meta charset="UTF-8"> auch im HTML
Sie müssen aufhören zu verwenden
mysql_query()
— PHPsmysql_xxx()
Funktionen wurden ersetzt: Sie sollten entweder die verwendenmysqli
oderPDO
Bibliotheken statt. Beide sollten es einfacher machen, mit solchen Dingen zu arbeiten.– Spudley
8. August 2015 um 20:07 Uhr
Sollte auch für Sie die Lösung sein stackoverflow.com/questions/25286279/…
– Narr
8. August 2015 um 20:21 Uhr