在所有列中将字符集Latin1转换为Utf-8

时间:2018-07-18 18:46:24

标签: mysql phpmyadmin character-encoding mysql-workbench

我在Latin1中有一家大型银行,我需要转换银行所有列的所有值。

搜索发现一个手动执行此操作的命令。

UPDATE table SET column = CONVERT (cast (CONVERT (column USING latin1) AS BINARY) USING utf8);

但是银行有很多表和列,因此手动进行转换是不切实际的,您能帮我一些脚本来将该命令带到银行中的所有列吗?

3 个答案:

答案 0 :(得分:0)

使用与拉丁表完全相同的布局创建一个新表,但在创建表中指定utf8。

然后

INSERT INTO new_table SELECT * 
FROM latin_table

答案 1 :(得分:0)

-首先,让我们确定整个情况。

您使用的是哪个版本?如果是MySQL 5.7,请考虑转到utf8mb4,以便可以处理表情符号和所有中文。如果是5.5或5.6,也可以,但是您可能会遇到一些问题。

http://mysql.rjweb.org/doc.php/charcoll#fixes_for_various_cases

情况1:这些列当前为CHARACTER SET latin1 ,并且仅包含latin1编码的文本。然后对每个表执行此操作:

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);

更多讨论

字符集latin1,但其中包含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;

注意:如果您以TEXT开头,请使用BLOB作为中间定义。 (这是“两步ALTER,如其他地方所讨论。)(请确保其他规格相同-VARCHAR,NOT NULL等)

哪种情况?

为了确定您的情况,请通过以下方式提供当前数据的一小部分样本:

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

示例:如果col具有é,并且十六进制为E9,则为latin1。如果十六进制为C3A9,则将utf8不正确地存储到latin1中。 C383C2A9的十六进制表示“双重编码”。

生成ALTERs

可以找到here,以获取有关如何生成ALTERs的技巧。 (这不完全是您所需要的,而是关闭。)

答案 2 :(得分:0)

我设法(或多或少)实现了自动化,这是我的脚本或多或少地适用于任何数据库

https://gist.github.com/pobegov/f8b293fb6eb658a13feb1c318e6c07ed