首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在所有列中将字符集Latin1转换为Utf-8

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

Stack Overflow用户
提问于 2018-07-19 02:46:24
回答 2查看 1.7K关注 0票数 0

我在Latin1中有一个很大的银行,我需要转换该银行所有列的所有值。

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

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

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

EN

回答 2

Stack Overflow用户

发布于 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编码的文本。然后对每个表执行以下操作:

代码语言:javascript
复制
ALTER TABLE t CONVERT TO CHARACTER SET utf8;

情况2:列当前为CHARACTER SET latin1,但其中包含utf8编码的字符。这导致了Mojibake或无声的“双重编码”。修复程序需要为每一列添加一对更改

Case 3 (双重编码):然后,也只有在那时,才会调用以下代码:

代码语言:javascript
复制
UPDATE tbl SET col = CONVERT(BINARY(CONVERT(col USING latin1)) USING utf8mb4);

更多讨论

字符集latin1,但其中包含utf8字节;在修复字符集时保留字节:首先,假设您有以下tbl.col声明:

代码语言:javascript
复制
col VARCHAR(111) CHARACTER SET latin1 NOT NULL

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

代码语言:javascript
复制
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等)。

哪种情况??

为了确定您的案例,请通过以下方式提供当前数据的一个小样本:

代码语言:javascript
复制
 SELECT HEX(col), col FROM t WHERE ...

例如:如果colé,并且十六进制是E9 --那就是latin1。如果十六进制是C3A9,那么它就是错误地存储到latin1中的utf8。C383C2A9的十六进制表示“双重编码”。

生成更改

可以在中找到有关如何生成ALTERs的提示。(它不完全是您所需要的,但很接近。)

票数 2
EN

Stack Overflow用户

发布于 2018-07-19 04:16:29

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

然后

代码语言:javascript
复制
INSERT INTO new_table SELECT * 
FROM latin_table
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51409020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档