当使用CHAR(0)," \ 0"时,Mysqldump会中断输出或0x0

时间:2016-08-18 13:38:13

标签: mysql chr

我对这个MySql查询的一小部分有疑问:

SELECT

`p`.`person_id`,
`p`.`prename`,
`p`.`name`,
(
    SELECT GROUP_CONCAT(`node`.`name` SEPARATOR "\0")

    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之后结束。缺少完整的休息。因此,dumpfile不完整,因此被破坏,无法再次导入。

我尝试了不同的方法来处理null char:

GROUP_CONCAT(`node`.`name` SEPARATOR "\0")
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输出?也许这是一个字符集/转换问题?默认情况下,我使用utf8 / utf8_general_ci

信息:MysqlWorkbench或Navicat等工具无法编辑视图。可编辑的结果字符串也以相同的方式被破坏。

1 个答案:

答案 0 :(得分:1)

同时我猜我发现了问题(不是解决方案)。这是自2011年以来存在的一个真正的mysql错误。

请参阅https://bugs.mysql.com/bug.php?id=60920

糟糕的是(如果我理解正确的评论),它已在Mysql版本5.7.1中得到修复。这意味着我必须重写一些代码并使用一些非空白分隔符来使这个东西在mysql版本中工作&lt; 5.7.1。