将所有列中的字符集latin1转换为utf-8

e0bqpujr  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(534)

我有一个用拉丁文1写的大银行,我需要转换银行所有列的所有值。
搜索发现手动执行此操作的命令。 UPDATE table SET column = CONVERT (cast (CONVERT (column USING latin1) AS BINARY) USING utf8); 但是银行有很多表和列,所以手动进行转换是不切实际的,您能帮我编写一些脚本,将该命令带到银行中的所有列吗?

gstyhher

gstyhher1#

创建一个与拉丁表布局相同的新表,但在create table中指定utf8。
然后

INSERT INTO new_table SELECT * 
FROM latin_table
pexxcrt2

pexxcrt22#

不——首先让我们来决定整个情况是什么。
你用的是什么版本?如果是MySQL5.7,考虑使用utf8mb4,这样就可以处理emoji和所有的中文。如果是5.5或5.6,这也是可能的,但您可能会遇到一些问题。
http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases
案例1:列当前为 CHARACTER SET latin1 只包含拉丁1编码的文本。然后对每个表执行以下操作:

ALTER TABLE t CONVERT TO CHARACTER SET utf8;

案例2:列当前为 CHARACTER SET latin1 但里面有utf8编码的字符。这导致了mojibake或无声的“双重编码”。修复程序需要对每列进行一对修改:
情况3(双重编码):然后,也只有在那时,这才被调用:

UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);

更多讨论
字符集拉丁1,但有utf8字节;在修复字符集时不要使用字节:首先,假设您对tbl.col有以下声明:

col VARCHAR(111) CHARACTER SET latin1 NOT NULL

然后在不更改字节的情况下转换列:

ALTER TABLE tbl MODIFY COLUMN col VARBINARY(111) NOT NULL;
ALTER TABLE tbl MODIFY COLUMN col VARCHAR(111) CHARACTER SET utf8mb4 NOT NULL;

注意:如果从文本开始,请使用blob作为中间定义(这是“2步alter,如其他地方所讨论的)。(请确保其他规范保持不变-varchar、notnull等)
哪种情况??
为了确定您有哪种情况,请通过以下方式提供当前数据的小样本:

SELECT HEX(col), col FROM t WHERE ...

示例:如果 colé ,十六进制是 E9 --那是拉丁语1。如果十六进制是 C3A9 ,它的utf8不正确地存储到拉丁1。六角 C383C2A9 表示“双重编码”。
生成更改
关于如何生成 ALTERs 可以在这里找到(这并不完全是你所需要的,但很接近。)

相关问题