UTF8发布PHP - > MySQL的。在数据库中获取问号?

时间:2010-12-16 12:03:21

标签: php mysql utf-8

好的,我目前使用的是PHP / MySQL / UTF-8 / Unicode地狱!

我的环境: MySQL:5.1.53 服务器characterset:latin1 Db characterset:latin1 客户端字符集:latin1 Conn.characteretet:latin1

PHP:5.3.3

我的PHP文件保存为UTF-8格式,而不是ASCII文件。

在我的PHP代码中,当我建立数据库连接时,我执行以下操作:

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

我的MySQL数据库的格式/创建是:

  

CREATE TABLE IF NOT NOT EXISTS app_languages(     language_id int(10)unsigned NOT NULL,     app_id int(10)unsigned NOT NULL,     description tinytext整理utf8_unicode_ci,     PRIMARY KEY(language_idapp_id)   )ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

从我的PHP代码生成的SQL语句如下所示:

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, "アラビア語のスポーツニュースと情報")

然而,输出显示在我的数据库中:

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

我做错了什么?

P.S。我们可以使用Putty直接SSH到数据库服务器,并通过命令行粘贴其中一个unicode / multi-lingual插入语句。他们成功地工作了!?

感谢你能解决这个问题,这让我很生气。

干杯,杰森

5 个答案:

答案 0 :(得分:13)

在选择db:

后尝试执行以下查询
SET NAMES 'utf8'

此查询应解决文件和数据库中不同字符集的问题。

费利克斯

答案 1 :(得分:1)

你的问题的答案是正确的。你在整个数据库中使用latin1,它无法处理unicode。您还需要将它们更改为UTF-8。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

除非你已经知道你在处理什么,否则{p> mb_detect_encoding是没用的。除非指定第二个和第三个参数,否则您可能不应该依赖它。目前,它可能不会返回您的想法。

答案 4 :(得分:0)

我看到你将其视为???????的单词是阿拉伯语单词..必须有整理

cp1256_general_ci

UTF-8_general_ci

改变这一点,它可以解决问题。