2010-12-16 2 views
14

OK, ich bin derzeit in PHP/MySQL/UTF-8/Unicode-Hölle!UTF8 gibt PHP -> MySQL aus. Fragezeichen in der Datenbank bekommen?

Meine Umgebung: MySQL: 5.1.53 Server characterset: latin1 Db characterset: latin1 characterset. Kunde: latin1 Conn characterset: latin1

PHP: 5.3.3

Meine PHP-Dateien werden als UTF-8-Format, nicht als ASCII-Dateien gespeichert.

In meinem PHP-Code, wenn ich die Datenbankverbindung ich folgendes tun machen:

ini_set('default_charset', 'utf-8'); 
$my_db = mysql_connect(DEV_DB, DEV_USER, DEV_PASS); 
mysql_select_db(MY_DB); 
// I have tried both of the following utf8 connection functions 
// mysql_query("SET NAMES 'utf8'", $my_db); 
mysql_set_charset('utf8', $my_db); 
// Detect if form value is not UTF-8 
if (mb_detect_encoding($_POST['lang_desc']) == 'UTF-8') { 
$lang_description = $_POST['lang_desc']; 
} else { 
$lang_description = utf8_encode($_POST['lang_desc']); 
} 
$language_sql = sprintf(
'INSERT INTO app_languages (language_id, app_id, description) VALUES (%d, %d, "%s")', 
          intval($lang_data['lang_id']), 
          intval($new_app_id), 
          mysql_real_escape_string($lang_description, $my_db) 
); 

Das Format/erstellen meiner MySQL-Datenbank ist:

CREATE TABLE IF NOT app_languages VORHANDEN ( language_id int (10) vorzeichenlos NOT NULL, app_id int (10) unsigniert NOT NULL, description tinytext sortieren utf8_unicode_ci, PRIMÄR Schlüssel (language_id, app_id) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

die SQL-Anweisungen, die von meinem PHP-Code erzeugt werden wie folgt aussehen:

INSERT INTO app_languages (language_id, app_id, description) VALUES (91, 2055, "阿拉伯体育新闻和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (26, 2055, "阿拉伯體育新聞和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (56, 2055, "בערבית ספורט חדשות ומידע") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (69, 2055, "アラビア語のスポーツニュースと情報") 

Dennoch erscheint die Ausgabe in meiner Datenbank wie folgt aus:

|   69 | 2055 | ?????????????????        | 
|   56 | 2055 | ?????? ????? ????? ?????      | 
|   28 | 2055 | Arapski sportske vijesti i informacije   | 
|   42 | 2055 | Arabe des nouvelles sportives et d\'information | 
|   91 | 2055 | ??????????          | 

Was ich tue, falsch ??

P.S. Wir können Putty zu SSH direkt auf den Datenbankserver und über die Befehlszeile Einfügen einer der unicode/mehrsprachigen insert-Anweisungen verwenden. Und sie arbeiten erfolgreich !?

Danke für jedes Licht, das du auf dieses Licht werfen kannst, es macht mich verrückt.

Prost, Jason

Antwort

1

Die Antwort ist in Ihrer Frage richtig. Sie verwenden latin1 in Ihrer Datenbank und können Unicode nicht verarbeiten. Sie müssen diese auch in UTF-8 ändern.

+0

Nein, das ist nicht korrekt, weil Sie in meinen Kommentaren sehen werden "PS Wir können Putty zu SSH direkt auf den Datenbankserver und über die Befehlszeile Einfügen einer der unicode/mehrsprachigen Insert-Anweisungen. Und sie funktionieren erfolgreich !? " – Jason

+0

@Jason Sind Sie sicher, dass der Putty die richtige Kodierung verwendet? http://thegreyblog.blogspot.com/2009/08/configuring-putty-to-use-utf-8.html – bobo

+0

@bobo, ja das ist genau, wie Putty Codierung behandelt, ist es UTF-8. – Jason

13

versuchen Sie die folgende Abfrage ausführen, nachdem Sie den db ausgewählt:

SET NAMES 'utf8' 

diese Abfrage das Problem mit unterschiedlichen Zeichensätzen in Dateien und der db lösen sollte.

felix

+1

Vielen Dank. Ihre Antwort hat mein ernstes Problem gelöst. –

+0

gute Antwort. Ich hatte das gleiche Problem, so löste es mein Problem. Danke vielmals – ako

0
//first make sure your file produce utf-8 chars 
header('Content-Type: text/html; charset=utf-8'); 
0

mb_detect_encoding ist ziemlich nutzlos, wenn Sie bereits wissen, was Sie zu tun haben. Sie sollten sich wahrscheinlich nicht darauf verlassen, wenn Sie das zweite und dritte Argument nicht angeben. Derzeit gibt es wahrscheinlich nicht, was Sie denken, dass es tut.

0

Ich sehe, dass die Wörter, die Sie es als ??????? sahen, arabische Wörter sind.was muss

cp1256_general_ci 

nicht

UTF-8_general_ci 

Änderung eine Sortierung, die kann es das Problem lösen.