PDO 将日语字符错误地插入到数据库中
PDO inserts Japanese characters wrong in to database
背景
我目前正在为自己编写一个小型 Web 应用程序来测试我的日语。它包括先看一个日语单词,然后用荷兰语给出正确的翻译。我有一个小 set-up,我可以在其中指定带有荷兰语翻译的日语单词,它会被插入到数据库中。
问题
当插入某些日文字符时,例如“お”(或 "O" 对于那些想知道的人),它在数据库中被插入为“ず”(或 "Zu")。还有更多字符也被转换,但我忘记了(我清除了数据库以查看某些解决方案是否有效)。
我尝试了什么
我确保所有我认为需要 UTF-8
的东西都设置为 UTF-8
。我已将以下设置为 UTF-8
:
- HTML 页 header:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- PHP header(第一行):
header('Content-Type: text/html; charset=utf-8');
- MySQL table
japanese_words
:
ALTER TABLE japanese_words CONVERT TO CHARACTER SET utf8;
- PDO 编码:
$db = new PDO('mysql:host=localhost;dbname=japanese;charset=utf8', '****', '****');
并尝试过:
$db->exec("set names utf8");
指定日语单词在 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" />
...
您可能需要检查您的文件是否使用正确的字符集保存!
背景
我目前正在为自己编写一个小型 Web 应用程序来测试我的日语。它包括先看一个日语单词,然后用荷兰语给出正确的翻译。我有一个小 set-up,我可以在其中指定带有荷兰语翻译的日语单词,它会被插入到数据库中。
问题
当插入某些日文字符时,例如“お”(或 "O" 对于那些想知道的人),它在数据库中被插入为“ず”(或 "Zu")。还有更多字符也被转换,但我忘记了(我清除了数据库以查看某些解决方案是否有效)。
我尝试了什么
我确保所有我认为需要
UTF-8
的东西都设置为 UTF-8
。我已将以下设置为 UTF-8
:
- HTML 页 header:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- PHP header(第一行):
header('Content-Type: text/html; charset=utf-8');
- MySQL table
japanese_words
:
ALTER TABLE japanese_words CONVERT TO CHARACTER SET utf8;
- PDO 编码:
$db = new PDO('mysql:host=localhost;dbname=japanese;charset=utf8', '****', '****');
并尝试过:
$db->exec("set names utf8");
指定日语单词在 PHP 中有效。我可以转储并定期显示我网页中的日语单词。这意味着我的 HTML 和 PHP 设置正确。所以在将它插入数据库之前没有错误。
当我在数据库中手动插入日语单词时,它起作用了。
当我尝试使用 PDO
.
尝试显示 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" />
...
您可能需要检查您的文件是否使用正确的字符集保存!