我的MySQL数据库中包含一些中文符号(非ASCII符号)。当我在PHPMyAdmin中查看它们时,它们看起来是乱码。但是,如果我使用常规的mysqli API将它们显示在我的PHP网站上,它看起来很好,所以我假设数据库中的数据上传/存储正确,所以可能是服务器连接排序不正确。
打开数据库连接的PHP代码如下:
function openConnection(): mysqli
{
$databaseHost = "localhost";
$databaseUser = "root";
$databasePassword = '';
$databaseName = "my-database-name";
$connection = new mysqli($databaseHost, $databaseUser,
$databasePassword, $databaseName);
if ($connection->connect_error) {
die("Connection failed: " . $connection->connect_error);
}
return $connection;
}
我的PHPMyAdmin服务器连接排序规则是默认的utf8mb4_unicode_ci
,这似乎也是合理的。我的表也是用默认的utf8mb4_general_ci
创建的。对于用户可能进行的任何输入,这难道不应该很好吗?
在PHP中调用$connection->get_charset()
也会返回正确的字符集:
如果我在MyPHPAdmin中导出数据库数据,在Notepad++中导出的数据也是乱码的,我确保使用UTF-8编码查看它。如果我再次导入乱码的导出,数据库将再次显示乱码的数据,并且在网站上数据现在也显示乱码。在这种情况下,实际上发生了损坏的导出。
我该如何解决这个编码问题?显然PHP可以正确处理UTF-8,我的Apache Web服务器也支持UTF-8,我的数据库配置似乎也是正确的,但PHPMyAdmin或数据库/数据库表排序有问题。
2条答案
按热度按时间pkmbmrz71#
看起来问题完全出在别的地方,因为我是用C代码向PHP提供数据的。C代码使用nlohmann JSON库来构建提交给PHP脚本的数据。问题是当我把数据放入C++ JSON对象时,我无法像这里描述的那样将std::string编码为UTF-8。尽管如此,现在一切都按预期工作了。
taor4pac2#
如果列定义不是utf8 mb 4,则客户端和数据库之间将进行必要的转换。
有关PHP的更多说明:http://mysql.rjweb.org/doc.php/charcoll#php
如果您有特定的乱码,请参阅Trouble with UTF-8 characters; what I see is not what I stored
如果你怀疑数据是从PHP输入到记事本的,可以转储一些十六进制的中文字符并显示给我们。我希望每第四个字符是十六进制的F0,或者每第三个字符是在E3和EA之间。(这是4字符和3字符UTF-8编码的中文字符的第一个字节。)
记事本是否能正确处理UTF-8,还是需要进行设置?
如果你是在“cmd”视窗中,你可能需要
chcp 65001
;请参阅http://mysql.rjweb.org/doc.php/charcoll#entering_accents_in_cmd这样,将正确显示更多非英语字符。