我的MySQL数据库中包含了一些中文符号等(非ASCII符号).当我在PHPMyAdmin上看到他们的时候,他们看起来很混乱。但是,如果我使用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服务器也在为UTF-8服务,而且我的数据库配置似乎也是正确的,但是PHPMyAdmin或数据库/数据库表排序规则存在问题。
发布于 2022-07-07 14:47:37
看起来这个问题完全是在别处,因为我用C++代码向PHP提供数据。C++代码使用构建提交给PHP的数据。问题在于,当我将数据放入这里对象时,无法将std::字符串具体编码到UTF-8,就像所描述的C++。话虽如此,现在一切都如期而至。
发布于 2022-07-07 15:06:33
⚈ If using mysqli, do $mysqli_obj->set_charset('utf8mb4');
⚈ If using PDO do somethin like $db = new PDO('dblib:host=host;dbname=db;charset=utf8mb4', $user, $pwd);
⚈ Alternatively, execute SET NAMES utf8mb4其中任何一个都会说客户机中的字节是UTF-8编码的。如果有必要,如果列定义不是utf8mb4,则在客户端和数据库之间进行转换。
关于PHP的更多说明:http://mysql.rjweb.org/doc.php/charcoll#php
如果您有特定的混淆,请参见UTF-8字符的麻烦;我看到的不是我存储的东西。。
如果你怀疑从PHP到记事本的数据,抛出几个汉字的十六进制,并显示给我们。我希望每四个字符都是十六进制F0,或者每三个字符在E3和EA之间。(这是汉字4-字符和3-char UTF-8编码的第一个字节。)
记事本是否正确地处理UTF-8,还是需要设置?
如果您在Windows中的"cmd“中,您可能需要chcp 65001;请参见cmd,这样,更多的非英语字符将正确显示。
https://stackoverflow.com/questions/72895769
复制相似问题