繁体   English   中英

在MySQL的准备好的语句中发送NULL似乎不起作用

[英]Sending NULL in a prepared statement for MySQL doesn't seem to work

我正在发送要由MySQL执行的准备好的语句, 看起来我正确地遵循了协议,但是服务器始终返回:

Error 1210 - #HY000 - Incorrect arguments to mysqld_stmt_execute

消息字节的编码如下:

14 00 00    - size
00          - sequence
17          - message type
01 00 00 00 - statement id
00          - flags
01 00 00 00 - iteration count
80          - NULL bitmap (1000-0000)
01          - new params bound flag    
06 00       - NULL type
03 00       - INT type
0a 00 00 00 - 10 INT value

因此,我无法真正理解此消息与MySQL的期望有何不同,并且看起来我无法让MySQL向我解释这一点。

发送到服务器的SQL语句为:

CREATE TEMPORARY TABLE timestamps ( id INT NOT NULL, moment TIMESTAMP, primary key (id));
INSERT INTO timestamps (moment, id) VALUES (?, ?);

任何帮助表示赞赏。

您的空位图是错误的。 应该是01,而不是80。

从文档

NULL-bitmap-bytes = (num-fields + 7 + offset) / 8
NULL-bitmap-byte = ((field-pos + offset) / 8)
NULL-bitmap-bit  = ((field-pos + offset) % 8)

同样来自文档, For COM_STMT_EXECUTE this offset is 0.

您有两个字段:moment和id。 时刻为空。 moment是字段索引0。

NULL-bitmap-bytes = (num-fields + 7 + offset) / 8
  -> (2 + 7 + 0) / 8
  == 1

NULL-bitmap-byte = ((field-pos + offset) / 8)
  -> ((0 + 0) / 8)
  == 0

NULL-bitmap-bit  = ((field-pos + offset) % 8)
  -> ((0 + 0) % 8)
  == 0

因此,Null位掩码是1个字节,并且要设置字段0的位,请执行以下操作:

nulls[byte_pos] |= 1 << bit_pos

你的情况是

nulls[0] |= 1 << 0;

因此null [0]为01

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM