如何将latin1_swedish_ci数据转换为utf8_general_ci?

时间:2012-10-06 05:00:29

标签: php mysql character-encoding

我有一个MySQL数据库,所有表格字段归类为

latin1_swedish_ci

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

utf8_general_ci

这样我就可以显示任何语言内容。我已经将字段归类改为 utf8_general_ci ,但这不会将 CONVERT 所有旧记录改为 utf8_general_ci

2 个答案:

答案 0 :(得分:8)

一个有趣的事情。

如果表格中的字符集处于正确编码状态,则Anshu建议的CONVERT TO CHARSET和CONVERT()/ CAST()将正常工作。

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

除了字符集转换之外,

要解决此问题,还需要进行几项练习。

  1. “Hard one”是从转储中重新创建将通过控制台转换的数据库
  2. “简单的一个”是逐行或按表转换:
  3. 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;命令中。

答案 1 :(得分:1)

导出表格。 放下桌子。 在编辑器中打开导出文件。 在创建表结构的位置进行手动编辑。

旧查询:

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;

保存文件并重新导入数据库。