18

我有一个 MySQL 数据库,所有表字段排序为

latin1_swedish_ci

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

utf8_general_ci

这样我就可以显示任何语言内容。我已经将字段排序规则更改为utf8_general_ci但这不会将所有旧记录转换utf8_general_ci

4

2 回答 2

10

一件有趣的事。

如果表中的字符集采用正确的编码,Anshu 建议的 CONVERT TO CHARSET 和 CONVERT()/CAST() 将可以正常工作。

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

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

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

于 2014-07-15T10:31:29.977 回答
3

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

旧查询:

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;

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

于 2019-07-24T10:59:04.117 回答