Mysqldump 在使用 CHAR(0)、"\0" 或 0x0 时中断输出
Mysqldump breaks output when using CHAR(0), "\0" or 0x0
我对 MySql 查询的这一小部分有疑问:
SELECT
`p`.`person_id`,
`p`.`prename`,
`p`.`name`,
(
SELECT GROUP_CONCAT(`node`.`name` SEPARATOR "[=10=]")
FROM `node`
INNER JOIN `nodegroup`
ON `nodegroup`.`nodegroup_id` = `node`.`fk_nodegroup_id`
INNER JOIN `person_has_node`
ON `person_has_node`.`fk_node_id` = `node`.`node_id`
WHERE `person_has_node`.`fk_person_id` = `p`.`person_id`
GROUP BY `nodegroup`.`nodegroup_id`
) AS `nodes`
FROM `person` `p`
此查询用作我的应用程序内部的视图。它是由应用程序在一种更新过程中以编程方式创建的。结果和预期的一样,我可以毫无问题地使用视图。
当涉及到生成 CHAR(0) 分隔字段的子选择时,问题就开始了。
当我想导出完整的数据库时。这个视图,输出恰好在这个视图应该被转储的那部分被破坏了。完整的视图定义字符串在关键字 SEPARATOR
之后结束。缺少完整的其余部分。结果转储文件不完整,因此损坏,无法再次导入。
我尝试了不同的方法来处理空字符:
GROUP_CONCAT(`node`.`name` SEPARATOR "[=11=]")
GROUP_CONCAT(`node`.`name` SEPARATOR CHAR(0))
GROUP_CONCAT(`node`.`name` SEPARATOR 0x0)
结果总是一样的:
/*!50001 DROP TABLE IF EXISTS `person_nodes`*/;
/*!50001 DROP VIEW IF EXISTS `person_nodes`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8 */;
/*!50001 SET character_set_results = utf8 */;
/*!50001 SET collation_connection = utf8_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `person_nodes` AS select `p`.`person_id` AS `person_id`,`p`.`prename` AS `prename`,`p`.`name` AS `name`,(select group_concat(`node`.`name` separator ' */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
现在我不知道如何解决这个问题。我需要能够通过 mysqldump
转储该数据库并通过 mysql
导入到其他地方,因为这是部署过程的一部分。
目前我正在使用mysql Ver 14.14 Distrib 5.5.50, for debian-linux-gnu (x86_64) using readline 6.3
我正在以这种方式创建转储文件:
mysqldump -u <user> -p<pass> <dbname> -r <dumpfile>
或
mysqldump -u <user> -p<pass> <dbname> > <dumpfile>
有人知道如何防止破坏 mysqldump 输出吗?也许这是一个 char-set/conversion 问题?默认情况下我使用 utf8
/utf8_general_ci
.
信息:MysqlWorkbench 或 Navicat 等工具无法编辑视图。可编辑的结果字符串也以同样的方式被破坏。
与此同时,我想我发现了问题(不是解决方案)。这是一个真正的 mysql 自 2011 年以来就存在的错误。
见https://bugs.mysql.com/bug.php?id=60920
不好的是(如果我对评论的理解正确的话),它已在 Mysql 5.7.1 版中得到修复。这意味着我必须重写一些代码并使用一些非空白分隔符才能使它在 mysql 版本 < 5.7.1.
中工作
我对 MySql 查询的这一小部分有疑问:
SELECT
`p`.`person_id`,
`p`.`prename`,
`p`.`name`,
(
SELECT GROUP_CONCAT(`node`.`name` SEPARATOR "[=10=]")
FROM `node`
INNER JOIN `nodegroup`
ON `nodegroup`.`nodegroup_id` = `node`.`fk_nodegroup_id`
INNER JOIN `person_has_node`
ON `person_has_node`.`fk_node_id` = `node`.`node_id`
WHERE `person_has_node`.`fk_person_id` = `p`.`person_id`
GROUP BY `nodegroup`.`nodegroup_id`
) AS `nodes`
FROM `person` `p`
此查询用作我的应用程序内部的视图。它是由应用程序在一种更新过程中以编程方式创建的。结果和预期的一样,我可以毫无问题地使用视图。
当涉及到生成 CHAR(0) 分隔字段的子选择时,问题就开始了。
当我想导出完整的数据库时。这个视图,输出恰好在这个视图应该被转储的那部分被破坏了。完整的视图定义字符串在关键字 SEPARATOR
之后结束。缺少完整的其余部分。结果转储文件不完整,因此损坏,无法再次导入。
我尝试了不同的方法来处理空字符:
GROUP_CONCAT(`node`.`name` SEPARATOR "[=11=]")
GROUP_CONCAT(`node`.`name` SEPARATOR CHAR(0))
GROUP_CONCAT(`node`.`name` SEPARATOR 0x0)
结果总是一样的:
/*!50001 DROP TABLE IF EXISTS `person_nodes`*/;
/*!50001 DROP VIEW IF EXISTS `person_nodes`*/;
/*!50001 SET @saved_cs_client = @@character_set_client */;
/*!50001 SET @saved_cs_results = @@character_set_results */;
/*!50001 SET @saved_col_connection = @@collation_connection */;
/*!50001 SET character_set_client = utf8 */;
/*!50001 SET character_set_results = utf8 */;
/*!50001 SET collation_connection = utf8_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `person_nodes` AS select `p`.`person_id` AS `person_id`,`p`.`prename` AS `prename`,`p`.`name` AS `name`,(select group_concat(`node`.`name` separator ' */;
/*!50001 SET character_set_client = @saved_cs_client */;
/*!50001 SET character_set_results = @saved_cs_results */;
/*!50001 SET collation_connection = @saved_col_connection */;
现在我不知道如何解决这个问题。我需要能够通过 mysqldump
转储该数据库并通过 mysql
导入到其他地方,因为这是部署过程的一部分。
目前我正在使用mysql Ver 14.14 Distrib 5.5.50, for debian-linux-gnu (x86_64) using readline 6.3
我正在以这种方式创建转储文件:
mysqldump -u <user> -p<pass> <dbname> -r <dumpfile>
或
mysqldump -u <user> -p<pass> <dbname> > <dumpfile>
有人知道如何防止破坏 mysqldump 输出吗?也许这是一个 char-set/conversion 问题?默认情况下我使用 utf8
/utf8_general_ci
.
信息:MysqlWorkbench 或 Navicat 等工具无法编辑视图。可编辑的结果字符串也以同样的方式被破坏。
与此同时,我想我发现了问题(不是解决方案)。这是一个真正的 mysql 自 2011 年以来就存在的错误。
见https://bugs.mysql.com/bug.php?id=60920
不好的是(如果我对评论的理解正确的话),它已在 Mysql 5.7.1 版中得到修复。这意味着我必须重写一些代码并使用一些非空白分隔符才能使它在 mysql 版本 < 5.7.1.
中工作