我正在使用一对 PHP 脚本。一个脚本从 MYSQL 数据库读取数据并将其导出到 csv 文件,然后第二个脚本使用 csv 将导出的 csv 文件上传到另一个 MySQL 数据库实例。数据库表 A(导出)和 B(导入)的结构相同。
这些脚本适用于“普通”MySQL 表和列类型。但是,当我们将它们应用于在其中一个列(MySQL 列类型为“json”)中存储 JSON 对象的 MySQL 表时,导入失败。
导出数据的脚本按预期工作,生成一个 CSV 文件,其中 JSON 对象被双引号括起来……就像行中的其他值一样。
导出的 CSV 文件中的行如下所示(最后一项是复杂的 json 对象,为简单起见缩写):
"894","Somebody","Related","2020-02-20","{"name1":"value1","name2":"value2","name3":"value3"}","expired"
在导出数据的 PHP 脚本中,它本质上是这样的:
$rowStr = "894","Somebody","Related","2020-02-20","{"name1":"value1","name2":"value2","name3":"value3"}","expired";
file_put_contents($filepath, trim($rowStr), FILE_APPEND);
导出没有问题。行按预期出现在 CSV 文件中(与上述格式相同)。
我将 csv 读入另一个数据库的代码如下所示:
$allRows = array_map('str_getcsv',file($fp)); // read the exported csv file where $fp is the path to the file
foreach($allRows as $i => $row) {
//get the col_names from the 2nd database table (identical to the first) where $ac-> is the class that handles data queries
$col_names = $ac->get_table_column_names('databasename',$tablename);
$update_arr = array();
foreach($col_names as $i => $cname) {
$update_arr[$cname['COLUMN_NAME']] = $val;
}
//and write the row to the 2nd db's table
$ac->create_update_table($update_arr,$tablename,FALSE);
}
而且,如果重要的话,这里是“get_table_column_names”和“create_update_table”函数中使用的查询:
get_table_column_names //使用PDO
SELECT COLUMN_NAME,COLUMN_DEFAULT,DATA_TYPE FROM information_schema.columns WHERE table_schema = :db AND table_name = :table
创建更新表
INSERT INTO 'tablename' (field1, field2, field3, field4,json_object_column) VALUES ("894","Somebody","Related","2020-02-20","{"name1":"value1","name2":"value2","name3":"value3"}")
发生的事情是 JSON 对象中的“,”被视为字段分隔符,并且 JSON 被分解为数组节点。除了编写脚本来检测以“{ 和 } 结尾的字段”之外,我如何将整个 json 字符串作为一个字段读取(因为它在数据库中)?或者,也许有更好的方法来输出字符串,以便可以将其作为一个项目读取?
Cats萌萌
Smart猫小萌