0

我正在发送一个准备好的语句,由 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 (?, ?);

对此的任何帮助表示赞赏。

4

1 回答 1

1

你的空位图是错误的。应该是 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。时刻为空。时刻是字段索引 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;

因此 nulls[0] 是01

于 2013-05-24T03:13:16.243 回答