了解mysql_stmt_bind_named_param()- MySQL C API

brqmpdu1  于 5个月前  发布在  Mysql
关注(0)|答案(2)|浏览(47)

我指的是mysql_stmt_bind_named_param()
我不理解文档中的例子。它使用了一些从未使用过的traceparent。我来自PHP,其中绑定变量使用:bindName语法。
我想我完全误解了它是如何工作的,我想给每个绑定变量命名,这样代码就变得更可读,也更少bug [想象一下一个有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部分中的文件不存在。文档很差,没有维护。
    1.在MySQL 8.2版本中,提到的文件是testclients/mysql_client_test.cc,它也很容易混淆。
    在我看来它不受支持。不知道Oracle实现了什么。
kuuvgm7e

kuuvgm7e1#

你误解了这个新的“命名参数”功能的用途。我同意他们在你链接的页面上没有很好地解释它。
他们将此功能称为“命名参数”,这当然会让人们认为它是关于添加标签作为参数占位符,因为其他一些SQL产品(例如Oracle)支持此功能。
这不是它的目的。这个特性没有实现类似Oracle的样式,即在参数占位符中使用标签。MySQL仍然只支持?作为位置(未命名)参数占位符。
他们称之为“命名参数”的功能意味着它允许你的查询访问一个Query Attribute,这是一个新功能。Query属性应该用于查询元数据,而不是将值作为参数传递给准备好的语句。
您可能想阅读此博客,以获得查询属性功能:的独立评论:

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

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

  • name:字符指针数组的地址,每个指针指向一个定义属性名的以null结尾的字符串。该数组应包含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数组长度一样多的元素,但是对于传统的查询参数,它们都是空指针。
编辑:
我不知道MySQL开发人员出了什么问题,他们几乎不可能让这个特性变得更加混乱或不方便使用。

xtupzzrd

xtupzzrd2#

我为MySQL C API编写了这个小extension,它支持使用灵活分隔符的真实的绑定变量行为:

const char * insertCommand { "INSERT INTO foo SET 
    bar_int = :barInt, bar_char = :barChar, bar_date = :barDate " };
MYSQL_STMT * preparedInsertStatement = mysql_stmt_init( mysqlConnection );

int  intBar     { 2804 };
char intChar [] { "Some-Text" };
size_t intCharLength = strlen(intChar);
MYSQL_TIME dateTime {};
  ... Set the <dateTime> members ...
    
FaF::MySqlExtBind fafExtBind( preparedInsertStatement, insertCommand );

fafExtBind.assignBindData( "barChar", MYSQL_TYPE_STRING,   intChar, &intCharLength );
fafExtBind.assignBindData( "barInt",  MYSQL_TYPE_LONG,     static_cast<void *>(&intBar) );
fafExtBind.assignBindData( "barDate", MYSQL_TYPE_DATETIME, &dateTime );

mysqlErrorCode = fafExtBind.executeBind();

字符串
使用自己的分隔符:

FaF::MySqlExtBind::setDelimiters( ":\\{", "\\}" );

相关问题