我在Latin1中有一家大型银行,我需要转换银行所有列的所有值。
搜索发现一个手动执行此操作的命令。
UPDATE table SET column = CONVERT (cast (CONVERT (column USING latin1) AS BINARY) USING utf8);
但是银行有很多表和列,因此手动进行转换是不切实际的,您能帮我一些脚本来将该命令带到银行中的所有列吗?
答案 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