Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Emacs中将大于4k的查询从SQL缓冲区发送到SQL mysql缓冲区?_Mysql_Linux_Emacs_Buffer_Ipc - Fatal编程技术网

如何在Emacs中将大于4k的查询从SQL缓冲区发送到SQL mysql缓冲区?

如何在Emacs中将大于4k的查询从SQL缓冲区发送到SQL mysql缓冲区?,mysql,linux,emacs,buffer,ipc,Mysql,Linux,Emacs,Buffer,Ipc,我经常在Emacs的SQLMySQL模式中遇到麻烦,我想知道是否有人有解决方案或更好的解决方法。每当我尝试将查询从sql模式缓冲区发送到活动的sql进程缓冲区时,该查询不能大于4k。如果它大于4k,则似乎插入了某种中断(可能是换行符),这会导致mysql解释器在下一行抛出错误 sql-mysql由sql.el实现,并使用函数sql-send-region将查询区域(或整个缓冲区)发送到所选sql进程缓冲区sql发送区域调用comint发送区域,后者依次调用进程发送区域process send r

我经常在Emacs的
SQLMySQL
模式中遇到麻烦,我想知道是否有人有解决方案或更好的解决方法。每当我尝试将查询从
sql模式
缓冲区发送到活动的sql进程缓冲区时,该查询不能大于4k。如果它大于4k,则似乎插入了某种中断(可能是换行符),这会导致mysql解释器在下一行抛出错误

sql-mysql
sql.el
实现,并使用函数
sql-send-region
将查询区域(或整个缓冲区)发送到所选sql进程缓冲区
sql发送区域
调用
comint发送区域
,后者依次调用
进程发送区域
process send region
是一个C函数,它调用Emacs源代码中的
src/process.C
中的
send\u process

看起来这可能只是IPC管道上4k缓冲区产生的限制。因为内核黑客似乎是改变这个大小所必需的,所以这不是一个很好的答案

我想我感到困惑的是,如果通过管道发送的SQL大于4k,为什么mysql客户端不能正确地重新组装它。有什么想法吗

Emacs版本:2012-03-25 allspice上的GNU Emacs 23.3.1(x86_64-pc-linux-GNU,GTK+版本2.24.10),由Debian修改

mysql-V:mysql版本14.14发行版5.5.24,适用于使用readline 6.2的debian linux gnu(x86_64)


Sql Mysql选项:-A-C-n(注意,我尝试过使用和不使用-n(无缓冲),但都没有解决此问题)

我怀疑罪魁祸首是Emacs的进程通信代码,由
comint
使用,分配PTY与进程对话。虽然这些工具对于交互式工作很有用,因为它们允许作业控制,但它们在一个块中可以传输多少数据而不需要插入换行符也受到限制。Emacs还可以被告知使用管道,而管道没有此限制

要测试这一点,请启动一个新的Emacs,评估
M-:(setq进程连接类型nil)
,然后启动
sqlmysql
。如果问题消失了,这就是你的罪魁祸首。在这种情况下,您将需要使用以下内容:

(add-hook 'sql-mysql-mode-hook
          (lambda ()
            (set (make-local-variable 'process-connection-type) nil)))
确保
进程连接类型
仅在MySQL交互缓冲区中重置


编辑


据介绍,Emacs不再费心用换行+EOF对中断长PTY输出。虽然提交时间为2010年4月13日,但它仅出现在2012年发布的Emacs 24中。这可以解释为什么24.2.1中的问题显然不可再现。如果您使用的是24之前的Emacs,请尝试升级。

BTW,到目前为止,我找到的最佳解决方法是直接从保存的文件中获取查询,即“\.sql\u long\u query.sql”。但是,当尝试调试查询或多查询文件的部分时,这相当烦人。这就是为什么我希望能够对大于4k字符的区域使用sql send region方法。还要注意,简单地将大于4k的查询复制并粘贴到sql mysql缓冲区也会遇到同样的问题。有更多证据表明问题处于或低于send_process C func级别。您可以尝试从rlwrap运行emacs吗?@ramrunner,这将要求从终端运行emacs,这并不总是(实际上从来都不是,imo)需要的。@MrBones:我不明白。您不能更改gui中的“按钮”以执行“rlwrap emacs”吗?这很简单。好吧,这几乎是一个完整的答案。M-:(setq进程连接类型nil)确实清除了传入SQL的4k限制。作为一个不幸的副作用,它似乎也抑制了MySQL提示,可能是因为MySQL客户端检测到从管道调用,并相应地更改其默认值。它还会导致MySQL客户端在出现错误时退出,而不是报告交互式错误消息。有必要向mysql调用添加-n标志(通过自定义),并且-t将恢复表格输出格式(-s模式是管道上的默认模式。)是否有任何方法可以更改PTY的行为以避免插入换行符,或者将其缓冲区大小增加到更大的值?看起来在PTY上关闭ICANNON可能会抑制它在每个缓冲区的文本末尾发送换行符。从Emacs内部分配时,我们如何清除PTY上的ICANON标志?仅供参考,我没有授予奖金的原因是管道连接mysql的错误行为。这是一种比原始问题更糟糕的解决方法,即能够更方便地开发大型SQL查询。每次出现错误都必须重新启动mysql,这比输入\更不方便。进入sqlmysql缓冲区。我们更接近了,但还不足以接受答案。有趣的是,我无法重复您在shell模式下使用PTYs时遇到的问题,比如说,
zsh
。我使用
C-u 100000 a RET
发送一个100k长的命令,并且(在等待Emacs解析输出一段时间之后),zsh产生的“command aaaaaaaaaaaaaaa…too long”错误在错误消息中正好有100k a。如果zsh能够从Emacs接收正确的输出,为什么mysql不能呢?