了解 mysql_stmt_bind_named_param() - MySQL C API

问题描述 投票:0回答:1

我参考mysql_stmt_bind_named_param()

我不明白文档中的示例。它使用了一些从未使用过的

traceparent
。我来自 PHP,其中绑定变量使用
:bindName
语法。

我认为我完全误解了它的工作原理。我想为每个绑定变量命名,这样代码就变得更具可读性,也更少错误[想象一下有 10 个字段的

INSERT
。]

有没有一种方法可以代替

INSERT INTO foo SET bar_int = ?, barChar = ?
运行类似
INSERT INTO foo SET bar_int = :intValue, barChar = :charValue
的函数
mysql_stmt_bind_named_param()

如果是的话,如何设置该功能的参数?

mysql_stmt_bind_named_param()
是相当新的,我在互联网上没有找到任何东西 - 如上所述,文档中的示例让我感到困惑而不是澄清。


Paul T 评论后更新:

  1. See Also
    部分中的文件不存在。文档非常差并且没有维护。
  2. 在 MySQL 8.2 版本中,提到的文件位于
    testclients/mysql_client_test.cc
    中,它也令人困惑。

在我看来,它不受支持。不知道 Oracle 实施了什么。

mysql mysql-connector
1个回答
0
投票

您误解了这个新的“命名参数”功能的用途。我同意他们在您链接到的页面上没有很好地解释。

他们将此功能称为“命名参数”,这当然会让人们认为它是添加标签作为参数占位符,正如其他一些 SQL 产品(例如 Oracle)所支持的那样。

事情不是这个意思。此功能未实现在参数占位符中使用标签的类似 Oracle 的风格。 MySQL 仍然仅支持

?
作为位置(未命名)参数占位符。

他们称之为“命名参数”的功能意味着它允许您的查询访问查询属性,这是一项新功能。查询属性应该用于查询元数据,而不是将值作为参数传递给准备好的语句。

您可能想阅读此博客以获得对查询属性功能的独立审查:

然后阅读手册中的这些页面:

后一个手册页更清楚地说明了如何在 C API 中使用

name
参数:

  • name
    :字符指针数组的地址,每个指针都指向定义属性名称的以空结尾的字符串。该数组应包含
    n_params
    元素,每个属性对应一个元素。查询属性名称使用
    character_set_client
    系统变量指示的字符集进行传输。

记住,这是为了绑定查询属性,而不是传统的查询参数。

您还可以在https://dev.mysql.com/doc/c-api/8.2/en/mysql-stmt-bind-named-param.html中的示例中看到,查询既有传统查询参数,其中

name
数组元素是空指针,以及命名查询属性,其中
name
数组元素是用于命名查询属性的字符串。

const char *names[2] = {nullptr, "traceparent"};

我推断,如果你只使用传统的查询参数,你仍然需要这个数组,并且它必须有与你的

binds
数组长度一样多的元素,但对于传统的查询参数,它们都是空指针。

© www.soinside.com 2019 - 2024. All rights reserved.