提问者:小点点

如何将latin1_swedish_ci数据转换为UTF8_GENERAL_CI?


我有一个MySQL数据库,其中所有的表字段排序规则为

latin1_swedish_ci

它已经存储了将近1000个记录,现在我想把所有这些数据转换成

utf8_general_ci

以便我可以显示任何语言内容。我已经将字段排序规则修改为utf8_general_ci,但这并不能将所有旧记录转换为utf8_general_ci


共2个答案

匿名用户

一件有趣的事。

如果表中的字符集编码正确,则Anshu建议的转换为字符集和CONVERT()/cast()将很好地工作。

如果由于某种原因,latin1列包含utf8文本,CONVERT()和CAST()将无法提供帮助。我已经把数据库与设置“搞乱”了,所以要花更多的时间来解决这个问题。

除了字符集转换之外,要解决这个问题还需要几个练习。

  1. “难点”是从将通过控制台转换的转储中重新创建数据库
  2. “Simple One”是逐行或逐表转换:
INSERT INTO UTF8_TABLE (UTF8_FIELD)
SELECT convert(cast(convert(LATIN1_FIELD using latin1) as binary) using utf8)
  FROM LATIN1_TABLE;

基本上,这两种情况都将处理字符串到原始符号,然后进行正确编码,而简单转换(使用编码的字段)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;

保存文件并导入回数据库。