嘗試在查詢前使用「SET NAMES utf8」命令。正如manual所說:
SET NAMES指示客戶端將用於發送SQL語句到服務器的字符集。
我試圖模仿你的情況。創建表test1:
DROP TABLE IF EXISTS `test1`;
CREATE TABLE `test1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`value` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
並試圖插入一個帶有法語特殊字符和中文的字符串。對我而言,即使沒有SET NAMES
,它也能正常工作。
<?php
$str = "çëÙùÛûÜüÔô漢語漢語";
try {
$conn = new PDO('mysql:host=localhost;dbname=test', 'user', '');
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->exec("SET NAMES utf8");
$stmt = $conn->prepare('INSERT INTO test1 SET value = :value');
$stmt->execute(array('value' => $str));
//select the inserted row
$stmt = $conn->prepare('SELECT * FROM test1 WHERE id = :id');
$stmt->execute(array('id' => 1));
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
print_r($row);
}
}
catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
它工作正常,印刷本:
Array
(
[id] => 1
[value] => çëÙùÛûÜüÔô漢語漢語
)
此外,當您正在測試不直接從控制檯讀取,輸出重定向到一個文件,並用文本編輯器打開它:
php test.php > 1.txt
哪種整理是你的數據庫? – medina 2013-05-13 06:46:52
我說這是utf8_unicode_ci – 2013-05-13 06:50:38