【问题标题】:How to assign the result of a shell command to a MySQL variable?如何将 shell 命令的结果分配给 MySQL 变量?
【发布时间】:2013-01-18 10:53:39
【问题描述】:

MySQL shell内的Shell命令返回值:

mysql> \! echo 1
1

如何将此结果分配给 MySQL 变量?喜欢:

mysql> set @var = \! echo 1
1
    -> ;

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法

【问题讨论】:

  • set @var = (SELECT 1);,set @var = 1,没有其他选择。

标签: mysql shell variables


【解决方案1】:

问题是SET是一个服务器命令,它改变了服务器上保存的变量的状态;而system(及其\! 的简写)是一个客户端命令,它在客户端上派生一个进程。虽然客户端可以将分叉进程的退出代码传输到服务器以存储在用户变量中,但我认为 MySQL 命令行客户端不提供此功能。

来自mysql-5.5.29/client/mysql.cc:

3958: static int
3959: com_shell(String *buffer __attribute__((unused)),
3960:           char *line __attribute__((unused)))
3961: {
3962:   char *shell_cmd;
3963: 
3964:   /* Skip space from line begin */
3965:   while (my_isspace(charset_info, *line))
3966:     line++;
3967:   if (!(shell_cmd = strchr(line, ' ')))
3968:   {
3969:     put_info("Usage: \\! shell-command", INFO_ERROR);
3970:     return -1;
3971:   }
3972:   /*
3973:     The output of the shell command does not
3974:     get directed to the pager or the outfile
3975:   */
3976:   if (system(shell_cmd) == -1)
3977:   {
3978:     put_info(strerror(errno), INFO_ERROR, errno);
3979:     return -1;
3980:   }
3981:   return 0;
3982: }

特别注意system(3) 调用的返回值不会存储在任何地方;但是,如果进程使用该代码退出,com_shell() 函数调用将返回 -1。

【讨论】:

  • @Yuriy:如果您想在服务器上运行该进程,您可以考虑使用UDF,这将使您能够执行SET @var := sys_eval('/bin/echo 1') 之类的操作(但请注意非常严重的安全警告) .
猜你喜欢
  • 2013-05-05
  • 2012-06-20
  • 1970-01-01
  • 2011-01-23
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多