PHP将日语字符串作为其他内容插入到utf8表中,但仍然可以成功读取它

时间:2012-06-14 13:56:29

标签: php mysql utf-8

为什么PHP在MySQL表中存储日语这样的字符,支持utf8作为其他东西,但是成功地从MySQL中读取了作为原始字符串的值?

E.g。

$db = new mysqli("localhost", "user", "pwd", "test");
$sql = "INSERT INTO testtable(name) VALUES ('ボーナスエリア');

从工作台开始,这已作为ディション插入到表格中 我不知道编码/映射是如何或在什么级别发生的。

在PHP中读回它会导致在网页上显示正确的字符串ボーナスエリア。 为什么以及如何运作?

更新 感谢所有评论到目前为止。 它不仅仅是好奇,它实际上导致我想要从另一个源插入字符的问题,即通过jdbc正确插入CJK字符的Java。这会导致PHP出现问题并将其显示为??????

任何人都可以证明编码将给出的字符翻译成db viewer中出现的内容吗?

更新2 我的浏览器(在显示之前与该问题无关,因为它是值????)是firefox,其编码设置为Western ISO-8859-1。我可以看到日语字符正确显示在?????旁边字符。矛盾的是,出现的字符是????在db查看器中正确显示。

浏览器设置

browser settings

网页摘要

web page snippet

1 个答案:

答案 0 :(得分:1)

PHP主要将文本视为任意二进制数据。这意味着在这些情况下,两个错误相互抵消是很常见的。

例如,如果您在源文件中编写ボーナスエリア并将其保存为UTF-8,那么PHP看到的是字节\xe3\x83\x9c\xe3\x83\xbc...,这就是它将使用的内容。您可以将该字符串传递给数据库客户端库,就像此处mysqli一样,如果幸运的话,当您稍后从数据库中获取文本时,客户端库将向PHP返回完全相同的字节。 与数据库实际存储数据的方式无关。

这里似乎发生的是数据库客户端库被配置为根据latin1解释PHP手中的数据,这意味着它将字节\xe3\x83\x9c...解释为字符デ...,这就是数据库将存储的内容。当您读取数据时,会发生同样的事情:客户端从数据库中获取字符デ...,并且由于它设置为在latin1中对它们进行编码,因此它将返回\xe3\x83\x9c...到PHP。这解释了如何在数据库中使用mojibake,但PHP应用程序似乎仍能正常工作。

当然,让数据库以可读格式存储文本会更好。为此,您必须将客户端编码(请参阅mysqli_set_charset)和数据库列编码(请参阅MySQL文档)设置为utf8