【问题标题】:MySQL data has wrong encoding when displaying using PHP [duplicate]使用PHP显示时MySQL数据编码错误[重复]
【发布时间】:2020-06-12 07:55:24
【问题描述】:

我完全被困住了。

我有一个在 PHP4 和 MySQL4 上运行的旧网站。 SQL 数据包含斯洛伐克语特殊字符(á、š、ť、ľ、ž 等)。旧网站显示的字符很好。

我已将该站点迁移到新主机,它现在在 PHP 7.3 和 MariaDB 10.3 上运行。我已经用 MySQLi 替换了不推荐使用的 mysql_ 函数,现在代码运行良好。但是,角色完全乱了。

我遇到了多个问题和答案,这是我尝试过的:

  1. 将字符集设置为 utf8 和/或 windows-1250 到 mysqli 连接

    $link->set_charset("utf8mb4"); mysqli_set_charset($mysqli, "utf8");

  2. 为每个 .php 文件设置 utf8 和/或 windows-1250 标头

    header('Content-Type: text/html; charset=utf-8');

  3. 使用 Sublime 文本以 UTF8 和/或 windows-1250 编码手动重新保存每个文件

  4. 将数据库排序规则更改为 utf8_unicode_ci、utf8_slovak_ci 以及其他内容

  5. 更改所有表和数据库的字符集

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

  6. 使用 PHP 的 iconv 手动将输出从 UTF8 转换为 windows-1250(这更加混乱了输出)

    $output = iconv( "Windows-1250", "UTF-8", ($output));

  7. 在导入旧数据库时尝试了不同的排序规则。还尝试在 phpMyAdmin 中使用和不使用 MYSQL40 导入兼容模式

  8. 同时设置 utf8 和/或 windows-1250 html 元字符集

    <meta http-equiv="Content-Type" content="text/html; charset=windows-1250"> <meta charset="UTF-8">

我发现的东西。当我直接在 phpMyAdmin 中读取 SQL 数据时,它会在旧数据库(mysql4)和新数据库中显示完全相同的数据,但编码混乱。但是,旧网站以某种方式在前端正确显示它。

我真的被困住了,我真的认为我已经尝试了所有解决方案。可能是什么问题?

【问题讨论】:

  • 您是否尝试过删除行/添加具有相同字母的新行?当服务器更新时,可能表行搞砸了。您也可以尝试创建一个新数据库,看看格式是否也搞砸了。
  • 你能说出应该显示什么以及现在显示什么吗?
  • 用一些插入数据给你的表创建查询
  • 或附上表格以便我们可以看到发生了什么
  • 帮助调试:SELECT HEX(col), col FROM ... 以查看表中的内容。

标签: php mysql encoding utf-8 character-encoding


【解决方案1】:

好的。 sbondo1234Tausif 的评论帮助我意识到新记录工作得很好。只有数据库中的旧数据被弄乱了。我更容易创建一个简单的矩阵并将错误编码的字符与正确的字符配对,然后使用简单的 SQL 查询更新它们。感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多