【问题标题】:Data is truncated after converting from latin1 to utf8从 latin1 转换为 utf8 后数据被截断
【发布时间】:2017-03-07 23:24:09
【问题描述】:

我有旧数据库,其中包含 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,数据没有被截断,但我仍然遇到问题,因为字符没有按应有的方式显示。

【问题讨论】:

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


    【解决方案1】:

    有多种方法可以转换/修复/等字符集。你选错路了。

    ALTER TABLE ... CONVERT TO ...
    

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

    Reference

    如果您在列中有“双重编码”,则需要其他内容。

    š 的十六进制数是

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

    More discussion

    【讨论】:

    • 这是单词->Kuæa,这是十六进制->4B75C3A661,这是二进制->4b75c3a661。怎么办?
    • 应该有库查
    • Kuæa 和 4B75C3A661 和 4b75c3a661 是一致的 utf8。 (十六进制的大写无关紧要。) Kuća 的 Utf8 十六进制为 4B75C48761。您提到了“截断”——链接中也对此进行了讨论。
    • 我使用了一些不同的工具将其全部转换为utf8并避免截断,这就是我最后得到的。有没有办法替换表中所有出现的某个单词?
    • UPDATE tbl SET col = 'new' WHERE col = 'old'; col 的所有情况从“旧”更改为“新”。你问的是这个吗?
    猜你喜欢
    • 2010-11-29
    • 1970-01-01
    • 2013-06-06
    • 2015-04-09
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 2016-07-13
    相关资源
    最近更新 更多