我在Latin1中有一个很大的银行,我需要转换该银行所有列的所有值。
搜索发现了一个手动执行此操作的命令。
UPDATE table SET column = CONVERT (cast (CONVERT (column USING latin1) AS BINARY) USING utf8);
但是银行有很多表和列,所以手动执行转换是不切实际的,您能帮我编写一些脚本,将该命令带到银行中的所有列吗?
发布于 2018-07-19 12:47:12
NO --首先让我们确定一下完整的情况是什么。
您使用的是什么版本?如果是Emoji 5.7,可以考虑去utf8mb4,这样你就可以处理Emoji和所有的中文了。如果是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或无声的“双重编码”。修复程序需要为每一列添加一对更改
Case 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;注意:如果从文本开始,请使用BLOB作为中间定义。(这是“2步更改,正如在其他地方讨论的那样。)(请确保其他规范保持不变- VARCHAR、NOT NULL等)。
哪种情况??
为了确定您的案例,请通过以下方式提供当前数据的一个小样本:
SELECT HEX(col), col FROM t WHERE ...例如:如果col有é,并且十六进制是E9 --那就是latin1。如果十六进制是C3A9,那么它就是错误地存储到latin1中的utf8。C383C2A9的十六进制表示“双重编码”。
生成更改
可以在中找到有关如何生成ALTERs的提示。(它不完全是您所需要的,但很接近。)
发布于 2018-07-19 04:16:29
创建一个与拉丁表布局完全相同的新表,但在Create table中指定utf8。
然后
INSERT INTO new_table SELECT *
FROM latin_tablehttps://stackoverflow.com/questions/51409020
复制相似问题