不知道为什么会这样,环境肯定有问题。我已将 db 声明为
CREATE DATABASE `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */
然后我有一个表声明为
CREATE TABLE `myabstract_table` (
`key_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`varchar_field` varchar(128) NOT NULL
PRIMARY KEY (`key_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
然后我通常用于这种情况的php代码:
function execSQL($conn, $sql, $values = false) {
try {
$stmt = $conn->prepare($sql);
if ($values)
foreach($values as $param=>$value)
$stmt->bindValue($param, $value);
if ( ! $stmt->execute() ) {
error_log ("PDO Error: ".json_encode($stmt->errorInfo()));
return false;
}
} catch (PDOException $e) {
error_log ("Exception: " . $e->getMessage());
return false;
}
return $stmt;
}
然后将字符串(通过 INSERT 语句)保存到带有问号而不是非 ASCII 符号的db
PS。我set names 'utf8'
在任何 sql 请求之前执行,所有 php 内容都为 UTF-8 配置,html 文档标题包含元标记,其中 UTF-8 被指定为字符集;我唯一没有尝试的是更改模式本身的默认字符集(目前是 latin1),因为我很确定它没有问题。或者是吗?