我在"Renè"等名称中插入带有特殊字符的值时遇到问题。名字"Renè"在我的数据库中显示如下:"René">
我试图将数据库中的字段更改为"utf8_general_ci",这没有帮助,所以它可能在我的代码中。
该名称来自 JQuery Ajax 请求,我能够在调用的.php文件中正确回显此名称。
$fullname = $_POST['playersearch'];
echo "<div class='n_ok'><p>Inserted $fullname successfully (PlayerID is $id)</p></div>";
我使用 PDO 连接到我的数据库,并指定了 UTF-8 字符集:
$db = new PDO("mysql:host=$dbhost;dbname=$dbname",$dbuser,$dbpass,array('charset'=>'utf8'));
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
插入数据库发生在此处:
$stmt = $db->prepare("INSERT INTO PlayerCards (playerName, buyPercentage) VALUES (?, ?)");
$stmt->bindParam(1, $fullname);
$stmt->bindParam(2, $buypercentage);
为什么它在我的MySQL数据库中看起来如此奇怪?
根据手册:
- http://php.net/manual/en/ref.pdo-mysql.connection.php
它指定 PDO 中的字符集语法用作:
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);
另请阅读该页面上的警告:
警告 以下示例中的方法只能与与 ASCII 共享相同较低 7 位表示形式的字符集一起使用,例如 ISO-8859-1 和 UTF-8。使用具有不同表示形式(如 UTF-16 或 Big5(的字符集的用户必须使用 PHP 5.3.6 及更高版本中提供的字符集选项。
因此,在您的情况下,通过更改
array('charset'=>'utf8')
自
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
如果您希望在连接后运行初始化命令;请在下面的评论中详细介绍。
正如菲尔在评论中所说;连接后无需运行初始化命令。
也可以使用mysql:host=$dbhost;dbname=$dbname;charset=utf8
。
第 4 个参数(选项数组(用于连接上设置的特定驱动程序选项(通常是 PDO 属性(。
谢谢菲尔。