MySQL将拉丁1数据转换为UTF8
我使用LOAD data INFILE将一些数据导入MySQL数据库。表本身和列使用UTF8字符集,但数据库的默认字符集为latin 1。因为数据库的默认字符类型是latin1,并且我在没有指定字符集的情况下使用了LOAD DATA INFILE,所以它将文件解释为latin1,即使文件中的数据是UTF8。现在我的UTF8列中有一堆编码错误的数据。我发现这似乎解决了一个类似的问题,即“UTF8插入cp1251”,但我的问题是“Latin1插入UTF8”。我试着编辑那里的查询,将拉丁1数据转换为UTF8,但无法使其工作。要么数据出来的结果与以前一样,要么甚至比以前更糟。举个例子,魁北克这个词就是魁北克 [补充资料] 选择以十六进制()包装的数据时,Québec的值为5175C383C2A9626563 此表的创建表(简称)为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
CREATE TABLE MyDBName.`MyTableName`
(
`ID` INT NOT NULL AUTO_INCREMENT,
.......
`City` CHAR(32) NULL,
.......
`)) ENGINE InnoDB CHARACTER SET utf8;
将拉丁文1转换为UTF8不是您想要做的,您需要的是相反的 如果真的是这样的话:
加载数据填充允许您设置编码文件应位于:
我在旧的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