【问题标题】:Best way to export DB data in PHP, modify it, and import it在 PHP 中导出、修改和导入数据库数据的最佳方法
【发布时间】:2015-02-04 02:03:51
【问题描述】:

我需要从 MySQL 数据库中导出选定表中的数据,然后将其导入到另一个结构略有不同的 MySQL 数据库中。 IOW,我需要修改导出和导入之间的数据(而不仅仅是字段名称)。

我尝试过使用 json_encode 和 json_decode 并且几乎可以工作,但是如果所有数据都不是纯 utf8,那么 json_encode 会掉下来,而 utf8_encode 并不能解决这个问题。

我正在考虑用 PHP 进行 CSV、序列化和生成 SQL。这些选项中的哪一个会给我最可靠的转移?

【问题讨论】:

  • 只要你可以从一个 MySQL 命令行“看到”两个数据库,你可以在直接 SQL 中更有效地做到这一点

标签: php mysql import export


【解决方案1】:

您可以使用 PDO 来查询和创建对象数组,而不是直接在代码中修改。然后使用该数据导入另一个数据库。

更好的问题是为什么 UTF-8 不适合您。确保您使用的是最新版本的 PHP。 还要确保您使用 mb_ 前缀函数来维护 UTF-8(或其他多字节)编码。

List of PHP MultiByte String Functions

【讨论】:

  • 我怀疑数据在字符集方面有些损坏,尽管在 PhpMyAdmin 中查看问题字段时看起来不错。但是,在原始 JSON 输出中,有些为空,有些被截断。至于创建对象数组,我应该提到数据库通常位于不同的服务器上,我正在尝试创建一个通用工具来进行传输,因此我需要将数据写入文件、移动文件和然后导入它。我希望序列化或 CSV 将避免 json_encode 的字符集问题。
  • 如果您使用的是较新版本的 PHP,它应该已经支持字符集。 Serialize 和 jsonencode 应该遇到相同的字符集问题。您可以尝试使用 mb_ 函数转换为 UTF-8 或转换为 ASCII。数据应该是什么样子?如果您可以展示示例,可能会有所帮助。
【解决方案2】:

您还可以在导出期间调整数据,具体取决于您如何使用 SELECT 语句转储数据并重新排序列,或者有选择地省略一些或使用条件来更改数据。结果仍然是一组行和列。只要它们与您的目标结构匹配,您就可以进行盲导入。很有可能,您正在使用 mysqldump 之类的东西,但这并不容易。根据需要的更改,您也可以在重新导入后始终使用 SQL 修改数据。

由于 SQL 是为处理数据而设计的,这可能是处理事情的最简单方法,而不是在 PHP 处于转储格式时尝试用 PHP 解析大量内容。

【讨论】:

  • 麻烦的是我需要根据目标数据库进行修改,这可能会有所不同。我需要在导入过程中完成大部分 mod,所以 mysqldump 不是一个好的选择。
  • 假设您在导出时知道目标数据库,那么在您的 SELECT 中调整数据可能会正常工作。除非出于某种原因,您无法控制导出部分。如果您从原始 SQL 或 CSV 或其他格式的预转储数据集开始,您可能可以使用 awk 或 sed 或 *nix 中的其他东西来操作数据。并不是说你不能在 PHP 中做到这一点,而是有一些更强大的 *nix 命令可能会有所帮助。
【解决方案3】:

我的问题并不是我想的那样是由 json_encode 问题引起的。相反,问题是一个错误的左连接。

所以答案是,只要您的查询格式正确,所有列出的方法都是可靠的。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多