PDO 将日语字符错误地插入到数据库中

PDO inserts Japanese characters wrong in to database

背景


我目前正在为自己编写一个小型 Web 应用程序来测试我的日语。它包括先看一个日语单词,然后用荷兰语给出正确的翻译。我有一个小 set-up,我可以在其中指定带有荷兰语翻译的日语单词,它会被插入到数据库中。

问题


当插入某些日文字符时,例如“お”(或 "O" 对于那些想知道的人),它在数据库中被插入为“ず”(或 "Zu")。还有更多字符也被转换,但我忘记了(我清除了数据库以查看某些解决方案是否有效)。

我尝试了什么


我确保所有我认为需要 UTF-8 的东西都设置为 UTF-8。我已将以下设置为 UTF-8:

指定日语单词在 PHP 中有效。我可以转储并定期显示我网页中的日语单词。这意味着我的 HTML 和 PHP 设置正确。所以在将它插入数据库之前没有错误。

当我在数据库中手动插入日语单词时,它起作用了。

当我尝试使用 PDO.

将字符插入数据库时​​,字符得到 "transformed"

尝试显示 PDO 生成的查询无效。我使用绑定参数而不是实际单词得到查询。

代码


add_word.php(一切正常):

$japanese_word = $_POST['japanese_word'];
$dutch_word = $_POST['dutch_word'];

$word = new Word();
$word->setDutchWord($dutch_word);
$word->setJapaneseWord($japanese_word);

$wordDAO = new WordDAO($db);
$success = $wordDAO->addWord($word);

WordDAO 方法,我认为问题出在哪里(或介于那里和实际 MySQL 数据库之间):

$query = "insert into `japanese_words` (`word`) values(:word)";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':word', strtolower($word->getJapaneseWord()));
$stmt->execute();
$japanese_word_id = $this->db->lastInsertId();

问题


我在这里做错了什么?我是否忘记设置更多编码或指定特定的 PDO 设置?感谢任何帮助。

问题是我在 bindParam 中使用了 strtolower()。这改变了日语单词的值。将代码更改为以下有效:

$query = "insert into `japanese_words` (`word`) values(:word)";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':word', $word->getJapaneseWord());
$stmt->execute();
$japanese_word_id = $this->db->lastInsertId();

我妈的这么嚣张copy/pasting(当然我一发题就发现了)

PDO

mb_internal_encoding('UTF-8');

$dbh = new PDO("mysql:host=localhost;dbname=japanese;charset=utf8");
$dbh->exec("set names utf8");

$query = "insert into `japanese_words` (`word`) values(:word)";
$stmt = $this->db->prepare($query);

// use mb_* function for japanese string 
$stmt->bindParam(':word', mb_strtolower($word->getJapaneseWord()));

$stmt->execute();

$japanese_word_id = $this->db->lastInsertId();

更改数据库的字符集和排序规则 Table

ALTER DATABASE japanese CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE japanese_words CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

设置页面的字符集

<?php
ini_set("default_charset", "UTF-8");
header('Content-type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...

您可能需要检查您的文件是否使用正确的字符集保存!