使用CHAR(0),“ \ 0”或0x0时,mysqldump中断输出

马可

我对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剩下的全部遗失了。结果,转储文件不完整,因此已损坏,无法再次导入。

我尝试了不同的方法来处理空字符:

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之类的工具无法编辑视图。可编辑的结果字符串也以相同的方式被破坏。

马可

同时,我想我找到了问题(不是解决方案)。自2011年以来,这是一个真正的mysql错误。

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

不好的是(如果我理解正确的话),它已在Mysql版本5.7.1中修复。这意味着我必须重写一些代码,并使用一些非空格分隔符才能使该东西在低于5.7.1的mysql版本中正常工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用UIBezierPath和CAShapeLayer时出现“无效的上下文0x0”

迅速的UInt32 0或0x0?

引导错误:Emask 0X0 SAct 0X0 SErr 0X0操作0X6被冻结

CGContextSaveGState:在应用启动时无效的上下文0x0

与jQuery一起添加src时,IMG具有0x0像素

进入调试器时EXC_BAD_ACCESS(代码= 1,地址= 0x0)

使用Gson时,TID 12680中的致命信号11(SIGSEGV),代码128,故障加法器0x0

从实时USB Linux启动时出错:从'cd0'读取扇区0x0失败

为什么 char 0x0 在 QT C++ QByteArray 中变成 0xFF (255)?

从Ada中的地址0x0读取

Matlab:如何生成0x0结构数组?

CGContextBeginPath: 无效的上下文 0x0

#<#<Class:0x0的未定义方法'pathname'

资源 $NotFoundException:资源 ID #0x0

awk如果0除以x输出0

Linux内核参数是由空格(0x20)还是NUL(0x0)分隔?

从 0x0 到 0x08048000 存储了什么?

操作系统是否使用内存地址 0x0?

如何使用UIBezierPath修复无效的上下文0x0?

使用sscanf将“ 0x0”解析为两个数字

为什么在使用DOM接口构建时SVG路径会折叠为0x0,但是在使用jQuery字符串构建时却起作用

Android模拟器-加载设备'goldfish_pipe'的实例0x0的状态时出错

线程已退出,代码为0(0x0),没有未处理的异常

该程序已退出,代码为0(0x0)。C ++

链接.o对象时,Makfile生成(.text + 0x0):多个定义和(.text + 0x44):未定义引用到错误。

当参数0x7和0x18时此程序的输出是什么

Swift扩展异常执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

(SWIFT)错误:操场执行中止:错误:执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0)

如何使用a [0]-a [0] a [1]-a [0] a [1] a [2]输出数组