0

我正在将大量 mysql 数据库从几个共享的 web 主机迁移到一个共享的 web 主机。

其中大部分是葡萄牙语,所以有很多特殊字符。我正在迁移的一些数据库是 latin1,一些是 cp1251,一些是 utf8。

当然,简单地转储数据库,然后将转储恢复到新主机上会完全搞砸编码和“?” 字符和其他废话出现在与数据库相关的实际网站中。

在小范围内,可以接受 html 字符集标签,知道要转储/恢复为什么,但问题是我们正在处理数千个数据库和网站,并且迁移都是通过自动完成的几个脚本。

我正在寻找有关转储/恢复这些数据库的最佳方式的建议,假设执行工作的脚本将不知道 HTML 标记中指定的编码

到目前为止,我已经尝试使用实际的 mysqldump 工具,以及使用 php 脚本模仿它,并从内存中转储而不是从文本文件中转储,这些似乎都不能完美地将数据从一个复制到其他没有编码问题。

我是否应该使用 UTF8 对转储进行编码,然后不管 html 代码页如何恢复原样?无论 HTML 代码页如何,都以 UTF8 转储和恢复?在每个 create table 语句中找到的默认字符集中转储和恢复?

我对这些不同场景的影响和影响的理解是有限的,但我需要知道的基本上是是否有一种方法可以完美地复制数据而不会在 2 个数据库服务器之间出现编码问题,而无需知道脚本的 HTML 使用的代码页正在访问数据。

4

1 回答 1

0

编码是一个非常难以解决的问题,尤其是在移动数据库时。首先尝试进行结构导入,然后将新结构与旧结构进行精确比较,特别注意数据库字符集、表默认字符集和列字符集。您可以从 information_schema 数据库中轻松获取这些信息。

一旦完全镜像,您就可以开始导入了。但是,请注意您可以在不同编码列中保存不同编码类型的字符(在 latin1 列中有 utf8 有效字符是很常见的,latin 1 是 1 字节字符集,而 utf8 可以有 up到 3 个字节)。

您可以在此之后尝试各种方法来转换转储,但据我所知,到目前为止,还没有一种 100% 有效的方法可以在同一列中转换这种混合编码类型的情况。最终,您可能需要进行一些手动清理。但希望第一种方法就足够了,一切都会好起来的。

于 2012-12-28T22:49:53.983 回答