2010-12-17 11 views
18

Ich benutze die PDO-Bibliothek mit MySQL-Datenbank in PHP, aber wenn ich irgendwelche Daten in UTF-8, wie arabische Wörter eingefügt, wird es in die Datenbank aber als ????????? eingefügt.PDO + MySQL und gebrochen UTF-8 Codierung

In meinem eigenen Rahmen, nachdem ich die PDO-Verbindung zu erstellen, sende ich zwei Abfragen - SET NAMES utf8 und SET CHARACTER SET utf8. Es funktioniert immer noch nicht.

Beispiel:

loadclass('PDO', array(
    sprintf(
     'mysql:host=%s;port=%s;dbname=%s', 
     confitem('database', 'host'), 
     confitem('database', 'port'), 
     confitem('database', 'name') 
    ), 
    confitem('database', 'username'), 
    confitem('database', 'password'), 
    array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect')) 
)); 
$this->query('SET NAMES ' . confitem('database', 'charset')); 
$this->query('SET CHARACTER SET ' . confitem('database', 'charset')); 

Umgehung: Verwenden json_encode Funktionsdaten zu konvertieren, bevor sie in die Datenbank einfügen und verwenden json_decode sie zu entschlüsseln, nachdem das Abrufen. So mache ich es jetzt.

+0

Sind Sie sicher, dass dies kein PHP-Problem ist? Stellen Sie sicher, dass Sie mbstring installiert haben? – Rahly

+0

Ich würde vorschlagen, die gleiche Zeichenfolge zurückzusenden und zu überprüfen, ob sie in Ordnung ist. Nur als Test. – s3v3n

+0

Was ist der Wert confitem ('database', 'charset')? –

Antwort

104

Es hat sich aber für willen künftige Generationen:

$pdo = new PDO( 
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 

Es zwingt UTF-8 auf gU Verbindung. Arbeitete für mich.

+1

Wenn Sie PDO :: MYSQL_ATTR_INIT_COMMAND => 'SET NAMES' UTF8 '' - stellen Sie sicher, dass Sie nicht hinzugefügt haben: -> exec ("SET CHARACTER SET utf8") ... – Jeffz

2

Versuchen Sie, den Wert default_charset in php.ini auf UTF-8 zu setzen. Oder Sie können es mit der ini_set Funktion einstellen.

Wenn die Eingabe über Formularübergaben erfolgt, stellen Sie sicher, dass Ihre Webseiten mit dem Meta-Tag auf UTF-8 eingestellt sind. vor wahrscheinlich gelöst Jahren

+0

Hallo, ok ich werde versuchen, aber ich brauche dieses lösen nicht, ich will es von meinem Skript zu lösen :)? – Jason4Ever

+0

ja .. Ich testete Daten von Webseiten kommen, ja es kommt mit UTF-8 Enconding, und es gibt eine utf-8 Codierung Meta-Tag – Jason4Ever

+0

Ich hatte gerade das gleiche Problem auf der Windows-Maschine, und dies war die Lösung für die Problem. Alles hat UTF-8 gesprochen ... außer PHP. – v010dya

33

Sie müssen den korrekten Zeichensatz für die Verbindung einstellen. Add charset=utf8 option to the DSN. (Dies ist MySQL-spezifische!)

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName;charset=utf8', 
    'username', 
    'password' 
); 

in PHP-Versionen unter 5.3.6, müssen Sie eine Behelfslösung verwenden jedoch als charset Option nicht unterstützt wird.

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 
+3

Wollte die vorhandene, am besten gewählte Antwort aktualisieren, aber [meine Bearbeitung wurde abgelehnt] (https://stackoverflow.com/review/suggested-edits/3904725). Daher posten Sie es als neue Antwort. – Palec

+0

Danke! 'charset = utf8'' Arbeite für mich auf Datatable Serverseite – mghhgm

+0

Danke dafür! charset = utf8 hat mir dieses sehr ärgerliche Problem auch klargemacht. – Brigante

1

Alle Versuche mögen:

PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' " 

oder

$this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt); 

oder

$this->connection->exec("set names utf8"); 

noch lesbarer Text Chaos erzeugt.

In meinem Fall war die Ursache des Problems: htmlentities vor dem Einfügen von Daten in eine Datenbank verwendet. Kyrillische Buchstaben wurden vollständig zerstört.