关于将 MYSQL 数据库及其数据从拉丁语转换为 UTF-8 的详细说明。那里有太多差异信息
Detailed instructions on converting a MYSQL DB and its data from latin to UTF-8. Too much diff info out there
有人能提供最好的方法,不仅可以将 mysql 数据库及其所有 table 从 latin1_swedish_ci 转换为 UTF-8 及其内容吗?我一直在研究整个 Whosebug 以及其他地方,建议总是不同的。
有些人建议只在 table 和数据库上使用这些命令:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
其他人说这只是改变了数据库和tables,而不是内容。
一些人建议转储数据库,使用正确的字符集和排序规则创建一个新的 table,然后将旧数据库导入其中。这实际上也转换了数据吗?
mysqldump --skip-opt --set-charset --skip-set-charset
其他人建议 运行 iconv 在导入之前针对转储的数据库?这是真的需要还是导入到 UTF-8 数据库中进行转换?
最后,其他人建议更改数据库,将 char/blog tables 转换为二进制,然后再转换回来。
方法太多了,已经很混乱了。
有人可以提供简明的分步说明,或向我指出如何将我的拉丁数据库及其内容转换为 UTF-8 的方法吗?如果有一个脚本可以针对数据库自动执行此过程,那就更好了。
提前致谢。
这是来自 Moodle 社区的示例:
https://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8
(向下滚动到 "Explained"。)
作者首先做了一个SQL转储,这是一个很大的SQL文件。然后他复制文件。之后,他使用 sed
对复制的文件进行了编码更正。最后,他将复制并更正的 SQL 转储文件导入回数据库。
我可以推荐这个,因为通过这个单一的步骤,很容易检查它们是否正确完成。如果出现问题,只需返回上一步并尝试其他方法。
使用MySQL Workbench 来处理这个问题。 http://dev.mysql.com/doc/workbench/en/index.html
- 运行 迁移向导生成用于创建数据库架构的脚本。
- 编辑该脚本以更改排序规则和字符集(notepad++ 搜索替换就可以了)和 shema 名称,这样您就不会覆盖现有数据库。
- 运行 以新名称创建副本的脚本。
- 使用迁移向导将数据批量传输到新架构。它将为您处理所有转换并确保您的数据仍然完好。
这是两个经常混为一谈的不同问题:
- 更改 table 或列的规范,说明它应该如何在内部存储 数据
- 将乱码 mojibake 数据转换为其预期字符
MySQL 中的每个文本列都有一个关联的 charset 属性,该属性指定存储在该列中的编码文本应作为内部存储。这只会真正影响该列中可以存储哪些字符以及数据存储的效率。例如,如果您要存储大量日语文本,sjis
作为一种编码可能比 utf8
更有效,并且可以节省一些磁盘空间 space.
列编码不会以任何方式影响输入和输出数据的编码to/from数据库。这是一个单独的设置,connection encoding,每次连接到数据库时为每个单独的客户端建立。 MySQL 将根据需要在连接编码和 column/table 字符集之间动态转换数据。您可以使用 utf8
连接连接到数据库,将日语文本发送到 sjis
列,然后 MySQL 将从 utf8
转换为 sjis
苍蝇(并在离开时反向返回)。
现在,如果您搞砸了连接编码(这种情况经常发生)并且您插入的文本的编码与指定的连接编码不同(例如,您的连接编码是 latin1
但是你实际上发送了 UTF-8 编码的数据),然后你将垃圾存储在你的数据库中,你需要恢复它。如果这是你的问题,请参阅 How to convert wrongly encoded data to UTF-8?。
但是,如果您的所有数据都很好并且您只想告诉 MySQL 从现在开始以不同的编码存储数据,您只需要这样做:
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
MySQL 会将当前数据从其当前字符集转换为新字符集,并将未来数据存储在新字符集中。就这些了。
有人能提供最好的方法,不仅可以将 mysql 数据库及其所有 table 从 latin1_swedish_ci 转换为 UTF-8 及其内容吗?我一直在研究整个 Whosebug 以及其他地方,建议总是不同的。
有些人建议只在 table 和数据库上使用这些命令:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
其他人说这只是改变了数据库和tables,而不是内容。
一些人建议转储数据库,使用正确的字符集和排序规则创建一个新的 table,然后将旧数据库导入其中。这实际上也转换了数据吗?
mysqldump --skip-opt --set-charset --skip-set-charset
其他人建议 运行 iconv 在导入之前针对转储的数据库?这是真的需要还是导入到 UTF-8 数据库中进行转换?
最后,其他人建议更改数据库,将 char/blog tables 转换为二进制,然后再转换回来。
方法太多了,已经很混乱了。
有人可以提供简明的分步说明,或向我指出如何将我的拉丁数据库及其内容转换为 UTF-8 的方法吗?如果有一个脚本可以针对数据库自动执行此过程,那就更好了。
提前致谢。
这是来自 Moodle 社区的示例:
https://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8
(向下滚动到 "Explained"。)
作者首先做了一个SQL转储,这是一个很大的SQL文件。然后他复制文件。之后,他使用 sed
对复制的文件进行了编码更正。最后,他将复制并更正的 SQL 转储文件导入回数据库。
我可以推荐这个,因为通过这个单一的步骤,很容易检查它们是否正确完成。如果出现问题,只需返回上一步并尝试其他方法。
使用MySQL Workbench 来处理这个问题。 http://dev.mysql.com/doc/workbench/en/index.html
- 运行 迁移向导生成用于创建数据库架构的脚本。
- 编辑该脚本以更改排序规则和字符集(notepad++ 搜索替换就可以了)和 shema 名称,这样您就不会覆盖现有数据库。
- 运行 以新名称创建副本的脚本。
- 使用迁移向导将数据批量传输到新架构。它将为您处理所有转换并确保您的数据仍然完好。
这是两个经常混为一谈的不同问题:
- 更改 table 或列的规范,说明它应该如何在内部存储 数据
- 将乱码 mojibake 数据转换为其预期字符
MySQL 中的每个文本列都有一个关联的 charset 属性,该属性指定存储在该列中的编码文本应作为内部存储。这只会真正影响该列中可以存储哪些字符以及数据存储的效率。例如,如果您要存储大量日语文本,sjis
作为一种编码可能比 utf8
更有效,并且可以节省一些磁盘空间 space.
列编码不会以任何方式影响输入和输出数据的编码to/from数据库。这是一个单独的设置,connection encoding,每次连接到数据库时为每个单独的客户端建立。 MySQL 将根据需要在连接编码和 column/table 字符集之间动态转换数据。您可以使用 utf8
连接连接到数据库,将日语文本发送到 sjis
列,然后 MySQL 将从 utf8
转换为 sjis
苍蝇(并在离开时反向返回)。
现在,如果您搞砸了连接编码(这种情况经常发生)并且您插入的文本的编码与指定的连接编码不同(例如,您的连接编码是 latin1
但是你实际上发送了 UTF-8 编码的数据),然后你将垃圾存储在你的数据库中,你需要恢复它。如果这是你的问题,请参阅 How to convert wrongly encoded data to UTF-8?。
但是,如果您的所有数据都很好并且您只想告诉 MySQL 从现在开始以不同的编码存储数据,您只需要这样做:
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
MySQL 会将当前数据从其当前字符集转换为新字符集,并将未来数据存储在新字符集中。就这些了。