如何修复PHPMyAdmin中的乱码字符

sbdsn5lh  于 2022-11-09  发布在  PHP
关注(0)|答案(2)|浏览(118)

我的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或数据库/数据库表排序有问题。

pkmbmrz7

pkmbmrz71#

看起来问题完全出在别的地方,因为我是用C代码向PHP提供数据的。C代码使用nlohmann JSON库来构建提交给PHP脚本的数据。问题是当我把数据放入C++ JSON对象时,我无法像这里描述的那样将std::string编码为UTF-8。尽管如此,现在一切都按预期工作了。

taor4pac

taor4pac2#

⚈  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

如果列定义不是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这样,将正确显示更多非英语字符。

相关问题