MySQL将拉丁1数据转换为UTF8

MySQL将拉丁1数据转换为UTF8,sql,mysql,collation,load-data-infile,Sql,Mysql,Collation,Load Data Infile,我使用LOAD data INFILE将一些数据导入MySQL数据库。表本身和列使用UTF8字符集,但数据库的默认字符集为latin 1。因为数据库的默认字符类型是latin1,并且我在没有指定字符集的情况下使用了LOAD DATA INFILE,所以它将文件解释为latin1,即使文件中的数据是UTF8。现在我的UTF8列中有一堆编码错误的数据。我发现这似乎解决了一个类似的问题,即“UTF8插入cp1251”,但我的问题是“Latin1插入UTF8”。我试着编辑那里的查询,将拉丁1数据转换为U

我使用LOAD data INFILE将一些数据导入MySQL数据库。表本身和列使用UTF8字符集,但数据库的默认字符集为latin 1。因为数据库的默认字符类型是latin1,并且我在没有指定字符集的情况下使用了LOAD DATA INFILE,所以它将文件解释为latin1,即使文件中的数据是UTF8。现在我的UTF8列中有一堆编码错误的数据。我发现这似乎解决了一个类似的问题,即“UTF8插入cp1251”,但我的问题是“Latin1插入UTF8”。我试着编辑那里的查询,将拉丁1数据转换为UTF8,但无法使其工作。要么数据出来的结果与以前一样,要么甚至比以前更糟。举个例子,魁北克这个词就是魁北克

[补充资料]

选择以十六进制()包装的数据时,Québec的值为5175C383C2A9626563

此表的创建表(简称)为

CREATE TABLE MyDBName.`MyTableName`
(
`ID` INT NOT NULL AUTO_INCREMENT, 
.......
`City` CHAR(32) NULL, 
.......
`)) ENGINE InnoDB CHARACTER SET utf8;

将拉丁文1转换为UTF8不是您想要做的,您需要的是相反的

如果真的是这样的话:

  • UTF-8字符串被解释为拉丁语-1,并被转换成UTF-8,将它们弄乱
  • 您现在正在或可能正在阅读UTF-8字符串,无需进一步解释
  • 您现在必须做的是:

  • 在没有转码的情况下读取“UTF-8”
  • 把它转换成拉丁语-1。现在你应该拥有原始的UTF-8了
  • 现在把它放在你的“UTF-8”栏中,不再进行转换

  • 加载数据填充允许您设置编码文件应位于:


    我在旧的wordpress安装中遇到过类似的情况,问题是数据本身已经在拉丁1数据库中的UTF-8中(由于WP默认字符集)。这意味着除了ddbb和表格格式之外,不需要转换数据。 根据我的经验,在进行转储时,事情会变得一团糟,因为我知道MySQL将使用客户端的默认字符集,在许多情况下,它现在是UTF-8。 因此,确保使用相同的数据编码导出非常重要。如果使用UTF-8编码的Latin1 DDBB:

    $ mysqldump –default-character-set=latin1 –databases wordpress > m.sql
    
    然后在重新导入UTF-8中的新数据库之前,替换导出转储中的拉丁1引用。有点:

    $ replace "CHARSET=latin1" "CHARSET=utf8" \
        "SET NAMES latin1" "SET NAMES utf8" < m.sql > m2.sql
    
    $replace“CHARSET=latin1”“CHARSET=utf8”\
    “集合名称拉丁1”“集合名称utf8”m2.sql
    
    在我的情况下,他帮了大忙。
    注释。

    我将拉丁语数据库的注释写到UTF-8数据库。所有表和字段都要更改UTF-8。

    虽然OP的实际情况还不太清楚,但我碰巧在MySQL文档中找到了一个解决方案。我把它贴在这里只是为了将来参考:

    警告

    “转换为”操作在字符集之间转换列值。如果在一个字符集中有一列(如latin1),但存储的值实际上使用了其他一些不兼容的字符集(如utf8),则这不是您想要的。在这种情况下,您必须对每个此类列执行以下操作:

    这样做的原因是,当您转换到BLOB列或从BLOB列转换时,没有转换

    试试这个:

    1) 转储数据库

    mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql
    

    我最近完成了一个自动转换过程的shell脚本。它还可以配置为要替换或删除的任何文本编写自定义过滤器。例如:剥离HTML字符等。表白名单和黑名单也是可能的。您可以从sourceforge下载它:

    请发布有关表的CREATETABLE语句,以及一些断开的行,但将断开的列用十六进制()包装,如下所示:
    从cities LIMIT 5中选择十六进制(名称)
    。有了这些信息,我可以根据那篇文章帮助您找到正确的修复方法。(顺便说一句:我喜欢那篇文章!它救了我好几次的命。)是的,我希望我能提前意识到这一点,但现在数据已经被破坏了。我想知道我是否可以在不重新导入的情况下修复它。是的!这是一个选项:[字符集charset_name]我见过MySQL转储,其中这个replace命令不够用,因为有些列被显式设置为latin1。我确实
    替换了“latin1”“utf8mb4”dump.utf8.sql
    以使该表中的所有内容都使用UTF-8。但是请注意,“latin1”并没有出现在转储中的任何其他位置(字段内容),为了确保这一点,我在导入它之前检查了差异。对于混合内容,这不起作用:代码:1366 SQL State:HY000---不正确的字符串值:'\xE4chste…'对于第1行的“kommentar”列,您可能希望导入github。谷歌代码现在是只读的
    mysqldump --default-character-set=latin1 -u username -p databasename < dump.sql
    
    cat dump.sql | mysql -u root -p newdbname