代码之家  ›  专栏  ›  技术社区  ›  jpo38

导入sql文件时出现UTF-8编码问题

  •  1
  • jpo38  · 技术社区  · 6 年前

    我有一个托管MySQL的服务器,PHPMyAdmin报告:

    Server version: 5.1.56-community
    MySQL charset: UTF-8 Unicode (utf8)
    

    我使用以下两种方法导出sql mysqldump -uroot -p database > file.dump mysqldump -uroot -p database -r file.dump (无论如何,生成的两个文件都是相同的)。

    由于服务器的SQL文件my.ini具有:

    default-character-set=utf8
    

    我将本地my.ini文件更改为

    默认字符集=utf8
    

    character-set-server=utf8
    

    他们都准备好了 latin1 . 不知道我为什么 character-set-server

    现在我开始HeidiSQL,它显示了 utf8mb4 utf8 对于会话参数。我不知道为什么:

    enter image description here

    现在,我导入转储的文件,我看到即使所有东西都在 utf8型

    在服务器上,我看到: enter image description here

    在HeidiSQL中,我看到: enter image description here

    特殊字符,如 Ã 未在本地数据库上正确显示。

    注意,如果我在服务器上安装HeidiSQL,variable选项卡将显示相同的值 会话 全球的 参数,以及 正确显示。

    所以这可能是问题的根本原因,但我不知道如何解决它。如果我改变主意 会话 utf8mb4接口

    3 回复  |  直到 6 年前
        1
  •  5
  •   jpo38    6 年前

    感谢deceze的评论,我可以解决这个问题。

    如果我保持“auto-detect”,导入会生成不好的内容(带有mojibake字符)

    不知道为什么HeidiSQL无法自动检测编码。。。

        2
  •  2
  •   Evert    6 年前

    一些想法:

    看起来您的角色集是正确的。HeidiSQL显示一个不同的字符集,这可能是因为客户机自己设置了一个字符集。

    例如,mysql服务器在默认情况下可能使用“Character set A”。如果客户机连接并说他们需要“字符集B”,服务器将动态地转换它。

    utf8mb4 是超集(且优于) utf8 . 最好让您的服务器默认为 utf8mb4接口 . 流行的用例 是表情符号。

    不管怎样,你得到 mojibake 可能与正确设置这些字符集无关。

    1. 您的表/列被设置为UTF-8。
    2. 客户端连接并告诉服务器“我想改用ISO-8559-1/拉丁语”。
    3. 尽管客户希望使用ISO-8559-1,但是 发送UTF-8。

    如果我是对的,这意味着您可以将所有的列、连接和表设置为UTF-8,但是您的数据很糟糕。

    你真的需要相反的操作。例如,如果您有一个PHP字符串 $data ,它被“双重编码”为UTF-8,过程简单地称为:

    $output = utf8_decode($input)
    

    在MySQL中也可以解决这个问题。看到这个了吗 stack overflow question.

    需要注意的几点:

    1. 显然,要做备份。

    旁注:这个问题非常常见。你有点幸运,你是法国人,因为这突出了问题所在。我见过的许多英语系统都有这个问题,但很长一段时间以来它基本上没有被注意到,因为很多文本都没有超出常见的ASCII范围。

        3
  •  0
  •   Rick James diyism    6 年前

    à 变成 Ã (有两个字符,第二个是空格)。

    latin1 SESSION GLOBAL 设置没有问题。让我们看看 SHOW CREATE TABLE .

    见Mojibake in Trouble with UTF-8 characters; what I see is not what I stored 可能的原因。可能涉及“双重编码”;让我们看看 SELECT col, HEX(col) ... .

    至于修复数据——这取决于您使用的是简单的Mojibake还是双重编码。看到了吗 http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases 两个都是。

    推荐文章