我有一个用拉丁文1写的大银行,我需要转换银行所有列的所有值。
搜索发现手动执行此操作的命令。 UPDATE table SET column = CONVERT (cast (CONVERT (column USING latin1) AS BINARY) USING utf8);
但是银行有很多表和列,所以手动进行转换是不切实际的,您能帮我编写一些脚本,将该命令带到银行中的所有列吗?
我有一个用拉丁文1写的大银行,我需要转换银行所有列的所有值。
搜索发现手动执行此操作的命令。 UPDATE table SET column = CONVERT (cast (CONVERT (column USING latin1) AS BINARY) USING utf8);
但是银行有很多表和列,所以手动进行转换是不切实际的,您能帮我编写一些脚本,将该命令带到银行中的所有列吗?
2条答案
按热度按时间gstyhher1#
创建一个与拉丁表布局相同的新表,但在create table中指定utf8。
然后
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编码的文本。然后对每个表执行以下操作:案例2:列当前为
CHARACTER SET latin1
但里面有utf8编码的字符。这导致了mojibake或无声的“双重编码”。修复程序需要对每列进行一对修改:情况3(双重编码):然后,也只有在那时,这才被调用:
更多讨论
字符集拉丁1,但有utf8字节;在修复字符集时不要使用字节:首先,假设您对tbl.col有以下声明:
然后在不更改字节的情况下转换列:
注意:如果从文本开始,请使用blob作为中间定义(这是“2步alter,如其他地方所讨论的)。(请确保其他规范保持不变-varchar、notnull等)
哪种情况??
为了确定您有哪种情况,请通过以下方式提供当前数据的小样本:
示例:如果
col
有é
,十六进制是E9
--那是拉丁语1。如果十六进制是C3A9
,它的utf8不正确地存储到拉丁1。六角C383C2A9
表示“双重编码”。生成更改
关于如何生成
ALTERs
可以在这里找到(这并不完全是你所需要的,但很接近。)