我参考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 评论后更新:
See Also
部分中的文件不存在。文档非常差并且没有维护。testclients/mysql_client_test.cc
中,它也令人困惑。在我看来,它不受支持。不知道 Oracle 实施了什么。
您误解了这个新的“命名参数”功能的用途。我同意他们在您链接到的页面上没有很好地解释。
他们将此功能称为“命名参数”,这当然会让人们认为它是添加标签作为参数占位符,正如其他一些 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
数组长度一样多的元素,但对于传统的查询参数,它们都是空指针。