如何将latin1_swedish_ci数据转换为utf8_general_ci?
2022-08-30 22:24:13
我有一个MySQL数据库,其中所有表字段排序为
latin1_swedish_ci
它已经存储了近1000条记录,现在我想将所有这些数据转换为
utf8_general_ci
这样我就可以显示任何语言内容。我已经将字段排序规则更改为utf8_general_ci但这不会将所有旧记录转换为utf8_general_ci
我有一个MySQL数据库,其中所有表字段排序为
latin1_swedish_ci
它已经存储了近1000条记录,现在我想将所有这些数据转换为
utf8_general_ci
这样我就可以显示任何语言内容。我已经将字段排序规则更改为utf8_general_ci但这不会将所有旧记录转换为utf8_general_ci
一件有趣的事情。
如果表中的字符集采用正确的编码,则转换为字符集和Anshu建议的CONVERT()/CAST())将正常工作。
如果由于某种原因 latin1 列包含 utf8 文本,则 CONVERT() 和 CAST() 将无法提供帮助。我用这个设置“搞砸”了我的数据库,所以花更多的时间解决这个问题。
要解决此问题,除了字符集转换之外,还需要进行一些练习。
INSERT INTO UTF8_TABLE (UTF8_FIELD)
SELECT convert(cast(convert(LATIN1_FIELD using latin1) as binary) using utf8)
FROM LATIN1_TABLE;
基本上,这两种情况都将字符串处理为原始符号,然后进行正确的编码,这在命令中不会发生。simple convert(field using encoding) from table;
导出表。放下表。在编辑器中打开导出文件。在创建表结构的位置手动编辑它。
旧查询:
CREATE TABLE `message` (
`message_id` int(11) NOT NULL,
`message_thread_id` int(11) NOT NULL,
`message_from` int(11) NOT NULL,
`message_to` int(11) NOT NULL,
`message_text` longtext NOT NULL,
`message_time` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
新查询:( 假设您要更改message_text字段。
CREATE TABLE `message` (
`message_id` int(11) NOT NULL,
`message_thread_id` int(11) NOT NULL,
`message_from` int(11) NOT NULL,
`message_to` int(11) NOT NULL,
`message_text` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
`message_time` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
保存文件并导入回数据库。