从latin1转换为utf8后,数据被截断

时间:2017-03-07 23:24:09

标签: mysql utf-8 iso-8859-1

我有一个旧的数据库,里面有latin1_swedish_ci整理的有价值数据。我现在正试图将其转换为utf8,但我遇到了问题。

我已经尝试了所有内容并阅读了我发现的每篇文章。我有几个数据库,其中一些技术对某些数据库有效,但不适用于这个。

首先,我尝试了这个,它适用于不同的数据库

UPDATE tt_news SET 
    title=convert(cast(convert(title using  latin1) as binary) using utf8), 
    short=convert(cast(convert(short using  latin1) as binary) using utf8), 
    bodytext=convert(cast(convert(bodytext using  latin1) as binary) using utf8)
WHERE 1

它将我的数据从Balaševiæevi截断到Bala

然后我尝试使用此

转换数据库
 mysqldump -u root -p mydb -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B mydb  > dump.sql

sed 's/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/' <dump.sql | sed 's/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/' >dump-fixed.sql

mysql -u root -p mydb < dump-fixed.sql

所有内容都转换为utf8_general_ci,数据不会被截断,但我仍然遇到问题,因为字符没有显示出来。

1 个答案:

答案 0 :(得分:1)

有多种方法可以转换/修复/ etc字符集。你采取了错误的方式。

ALTER TABLE ... CONVERT TO ...

是将正确编码的表从一种编码更改为另一种编码的最短技术。

Reference

相反,如果你有&#34;双重编码&#34;在列中,还需要其他东西。

š的十六进制是

9A in latin1
C5A1 in utf8
C385C2A1 if "double-encoded"

More discussion