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

Mysql 将所有列中的字符集Latin1转换为Utf-8,mysql,phpmyadmin,character-encoding,mysql-workbench,Mysql,Phpmyadmin,Character Encoding,Mysql Workbench,我有一个巨大的拉丁语银行,我需要转换银行所有列的所有值 搜索发现手动执行此操作的命令 updatetable SET column=CONVERT(使用utf8转换(转换(使用拉丁语1的列)为二进制) 但是银行有很多表和列,因此手动进行转换是不切实际的,您能帮我编写一些脚本,将该命令带到银行中的所有列吗?创建一个新表,使用与拉丁表相同的精确布局,但在创建表中指定utf8 然后 创建一个与拉丁表格布局相同的新表格,但在“创建表格”中指定utf8 然后 不——首先,让我们决定整个情况 你用的是什么版

我有一个巨大的拉丁语银行,我需要转换银行所有列的所有值

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

updatetable SET column=CONVERT(使用utf8转换(转换(使用拉丁语1的列)为二进制)


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

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

然后


创建一个与拉丁表格布局相同的新表格,但在“创建表格”中指定utf8

然后

——首先,让我们决定整个情况

你用的是什么版本?如果MySQL 5.7,考虑到UTF8Mb4,这样你就可以处理EMOJI和所有的中文。如果是5.5或5.6,这也是可能的,但您可能会遇到一些问题

案例1:列当前为
字符集latin1
,仅包含latin1编码的文本。然后对每个表执行以下操作:

ALTER TABLE t CONVERT TO CHARACTER SET utf8;
案例2:列当前为
字符集拉丁1
,但其中包含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;
注意:如果从文本开始,请使用BLOB作为中间定义。(这是“2步更改,如其他地方所讨论的)。(确保其他规范保持不变-VARCHAR、notnull等)

哪种情况??

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

 SELECT HEX(col), col FROM t WHERE ...
示例:如果
具有
é
,并且十六进制是
E9
——这是拉丁文1。如果十六进制是
C3A9
,则它的utf8不正确地存储在拉丁文1中。
C383C2A9
的十六进制表示“双重编码”

生成更改

您可以找到有关如何生成
更改的提示(这不是您所需要的,但很接近)。

--首先,让我们确定完整的情况

你使用什么版本?如果MySQL 5.7,考虑到UTF8Mb4,这样你就可以处理表情和所有的中文。如果5.5或5.6,这也是可能的,但是你可能会遇到一些问题。

案例1:列当前为
字符集latin1
,仅包含latin1编码的文本。然后对每个表执行此操作:

ALTER TABLE t CONVERT TO CHARACTER SET utf8;
案例2:列当前为
字符集拉丁1
,但其中包含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;
注意:如果从文本开始,则使用BLOB作为中间定义。(这是“两步更改,如其他地方所讨论的)。(确保其他规范保持不变-VARCHAR、notnull等)

哪种情况??

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

 SELECT HEX(col), col FROM t WHERE ...
示例:如果
é
,并且十六进制是
E9
——这是拉丁字母1。如果十六进制是C3A9
,则它的utf8不正确地存储到拉丁1中。
C383C2A9
的十六进制表示“双重编码”

生成更改


可以找到有关如何生成
更改的提示。(这不完全是您需要的,但很接近。)

您确定您需要一个
更新
语句而不是
ALTER TABLE
?我用ALTER TABLE对它进行了测试,但没有得到列中所包含内容的转换。请小心;有许多可能的解决办法;所有这些都只会让事情变得更糟。你确定你需要一个
UPDATE
语句而不是
ALTER TABLE
?我用ALTER TABLE测试了它,但我没有得到列中包含的内容的转换。小心;有许多可能的解决办法;所有这些只会让事情变得更糟。