it-swarm.com.de

SET NAMES utf8 in MySQL?

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. 

  1. Ist das etwas, was nur mit PDO gemacht wird?
  2. Wenn es sich nicht um eine PDO-spezifische Sache handelt, was ist dann der Zweck, dies zu tun? Ich merke, dass es die Kodierung für mysql setzt, aber ich meine, ich musste es nie benutzen, also warum sollte ich es verwenden wollen? 
100
JasonDavis

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.

69
Vinko Vrsalovic

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

42
karim79

Das richtige Kodieren ist wirklich schwierig - es gibt zu viele Ebenen:

  • Browser
  • Seite
  • PHP
  • MySQL

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.

DDL-Definition vs. reale Daten

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.

Was ist zu überprüfen?

Sie müssen überprüfen, in welcher Kodierung der Datenfluss auf jeder Ebene vorliegt.

  • Überprüfen Sie die HTTP-Header und Header.
  • Prüfen Sie, was wirklich in der Anfrage gesendet wurde.
  • Vergessen Sie nicht, dass MySQL fast überall eine Kodierung hat:
    • Datenbank
    • Tabellen
    • Säulen
    • Server als Ganzes
    • Klient
      Stellen Sie sicher, dass es überall das Richtige gibt.

Umwandlung

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';

Letzte Notiz:

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.

27
Ondra Žižka

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>
17
usama sulaiman

Die Lösung ist 

 $conn->set_charset("utf8");
8
nurp

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.

aus http://www.php.net/manual/de/mysqli.set-charset.php

5
user1783273

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: 

  • mySQL-Server spricht standardmäßig latin1
  • ihre Hole-App ist in Utf8
  • verbindung wird ohne Extra hergestellt (also: latin1) (keine SET NAMES utf8 ..., keine Methode/Funktion von set_charset ())

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!

1
user3162905

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

0