第二十七章连接器和API

目录

27.1 MySQL连接器/ C
27.2 MySQL连接器/ C
27.3 MySQL连接器/ J
27.4 MySQL连接器/网
27.5 MySQL连接器/ ODBC
27.6 MySQL连接器/ Python
27.7 MySQL C API
27.7.1 MySQL C API的实现
27.7.2同时MySQL服务器和连接器/ C装置
27.7.3示例C API的客户端程序
27.7.4构建和运行的C API的客户端程序
27.7.5 C API的数据结构
27.7.6 C API函数概述
12.7 c c API function defunction
27.7.8 C API的准备好的语句
27.7.9 C API编写报表的数据结构
27.7.10 C API编写的语句功能概述
27.7.11 C API编写的语句功能说明
27.7.12 C API螺纹功能描述
27.7.13 C API函数的客户端插件
27.7.14 C API接口的二进制日志
27.7.15 C API的二进制日志中的数据结构
27.7.16 C API的二进制日志功能概述
27.7.17 C API的二进制日志功能描述
27.7.18 C API加密连接支持
27.7.19 C API多语句执行支持
27.7.20 C API编写的语句处理日期和时间值
27.7.21 C API编写的调用语句支持
27.7.22 C API编写的语句的问题
27.7.23 C API的可选的结果集元数据
27.7.24 C API自动重联控制
27.7.25 C API的常见问题
27.8 MySQL,PHP的API
27.9 MySQL Perl API
MySQL的Python API的范围
27.11 MySQL Ruby API
27.11.1 MySQL / Ruby API
27.11.2红宝石/ MySQL的API
27.12 MySQL TCL API
MySQL的包装小于艾菲尔

MySQL连接器提供连接到MySQL服务器的客户端程序。API提供低级别的访问MySQL协议和MySQL的资源。两连接器和API使您能够连接并执行MySQL语句从另一种语言或环境,包括ODBC,java(JDBC),Perl,Python,PHP,Ruby,和本地C MySQL实例。

MySQL连接器

Oracle开发多个连接器:

MySQL的C API

直接访问使用MySQL本身在一个C程序,其C API通过提供低级别的访问MySQL客户端/服务器协议libmysqlclient客户端库。这是用来连接到MySQL服务器实例的主要方法,并使用MySQL的命令行客户端的许多MySQL连接器和API的详细方。

libmysqlclient包含在MySQL的分布和连接器/ C分布。

参见第27.7.1,MySQL C API的实现”

从C程序中访问MySQL,或建立一个语言的连接器或本章中的API不支持MySQL的接口,这C API是从哪里开始。一些程序员的工具可以帮助的过程;看4.7节,“MySQL程序开发工具”

第三方MySQL的API

其余在本章描述了具体应用语言的API从MySQL提供一个接口。这些第三方的解决方案是不发达或Oracle支持。它们的使用和能力提供基本信息这里仅供参考。

所有的第三方语言API使用的一个方法,使用libmysqlclient或实施本机驱动器。这两个解决方案,提供不同的好处:

表27.1,MySQL的API接口列出许多图书馆和MySQL的接口。

表27.1 MySQL的API接口

环境应用程序接口类型笔记
艾达bindings GNU Ada MySQLlibmysqlclient看到MySQL的GNU Ada绑定
CC APIlibmysqlclient看到27.7节,“MySQL C API”
C康乃狄置换libmysqlclient看到MySQL连接器/ C开发指南
C连接器/ Clibmysqlclient看到MySQL连接器/ C 8开发指南
MySQLlibmysqlclient看到MySQL的网站
MySQL的包裹libmysqlclient看到MySQL的包裹
可可MySQL的可可libmysqlclient用Objective-C可可环境兼容。看到mysql-cocoa.sourceforge.net http:/ / /
DMySQL的Dlibmysqlclient看到MySQL的D
艾菲尔埃菲尔MySQLlibmysqlclient看到第27.13,MySQL埃菲尔包装”
二郎erlang-mysql-driverlibmysqlclient看到erlang-mysql-driver
HaskellHaskell的MySQL bindings本机驱动器看到布瑞恩奥沙利文的纯Haskell MySQL绑定
hsql-mysqllibmysqlclient看到Haskell MySQL驱动程序
Java的JDBC连接器/ J本机驱动器看到MySQL连接器/ J 5.1开发指南
卡亚专用数据libmysqlclient看到专用数据
Lualuasqllibmysqlclient看到luasql
NET /单连接器/网本机驱动器看到MySQL连接器/网络开发者指南
目的CAMLObjective CAML MySQL的捕获libmysqlclient看到MySQL绑定目的CAML
八度数据库捕获角马的八度libmysqlclient看到数据库捕获角马的八度
ODBCODBC连接器/libmysqlclient看到MySQL连接器/ ODBC开发指南
PerlDBI/DBD::MySQLlibmysqlclient看到27.9节,“MySQL Perl API”
Net::MySQL本机驱动器看到Net::MySQL在CPAN
PHPmysqlEXT / MySQL接口(不推荐使用)libmysqlclient看到原来的MySQL的API
mysqliEXT / mysqli接口libmysqlclient看到MySQL的改进与扩展
PDO_MYSQLlibmysqlclient看到MySQL的函数(PDO _ MySQL)
PDO mysqlnd本机驱动器
PythonPython的连接器/本机驱动器看到MySQL连接器/ Python开发者指南
Python连接器/ Python的C扩展libmysqlclient看到MySQL连接器/ Python开发者指南
MySQLdblibmysqlclient看到部分27.10%,MySQL的Python API”
红宝石MySQL /红宝石libmysqlclient使用libmysqlclient。看到第27.11.1,“MySQL / Ruby API”
红宝石/ MySQL本机驱动器看到第27.11.2,“红宝石/ MySQL API”
方案Myscshlibmysqlclient看到Myscsh
SPLsql_mysqllibmysqlclient看到sql_mysqlSPL
TCLmysqltcllibmysqlclient看到第27,“MySQL TCL API”

27.1 MySQL连接器/ C

MySQL连接器/ C手册发表在独立的形式,不作为MySQL参考手册的一部分。看到这些文件的信息:

27.2 MySQL连接器/ C

MySQL连接器/ C手册发表在独立的形式,不作为MySQL参考手册的一部分。看到这些文件的信息:

27.3 MySQL连接器/ J

MySQL连接器/ J手动发表在独立的形式,不作为MySQL参考手册的一部分。看到这些文件的信息:

27.4 MySQL连接器/网

MySQL连接器/纯手工发表在独立的形式,不作为MySQL参考手册的一部分。看到这些文件的信息:

27.5 MySQL连接器/ ODBC

MySQL的ODBC连接器/手动发表在独立的形式,不作为MySQL参考手册的一部分。看到这些文件的信息:

27.6 MySQL连接器/ Python

MySQL连接器/ Python手册发表在独立的形式,不作为MySQL参考手册的一部分。看到这些文件的信息:

27.7 MySQL C API

C API提供了底层访问MySQL客户端/服务器协议,使C程序访问数据库的内容。C API的代码是分布式MySQL实现的libmysqlclient图书馆看到第27.7.1,MySQL C API的实现”

大多数其他的客户端API的使用libmysqlclient图书馆与MySQL服务器进行通信。(例外是连接器/ J和连接器/净。)这意味着,例如,你可以利用许多相同的环境变量,使用其他客户端程序,因为他们是从图书馆的参考。在一系列的这些变量,看4.1节,“MySQL程序概述”

在建立客户端程序使用C API的说明,见第27.7.4.1,“楼C API的客户端程序”。对于线程编程,看第27.7.4.3,”写的C API螺纹客户端程序”

笔记

如果升级后,你的经验与编译客户端程序问题,如Commands out of sync或意外的核心转储程序是编译使用旧头或库文件。在这种情况下,检查的日期MySQL的文件和libmysqlclient.a用于编译是否从新MySQL分配库。如果没有,编译程序与新的头文件和库。重新编译也可以编译对共享的客户端库如果库的主版本号的程序必要的改变(例如,从libmysqlclient.so.17libmysqlclient.so.18)。额外的兼容性信息,看第27.7.4.4,运行C API的客户端程序”

客户有一个最大的通信缓冲区的大小。该缓冲区是最初分配的大小(16KB)自动上升至最大尺寸(16MB默认)。因为缓冲区的大小,为保证需求增加,单纯增加最大限度本身并不导致更多的资源用于。这个尺寸检查主要是预防错误言论和通信数据包。

通信缓冲区必须足够大以包含一个SQL语句(客户端到服务器的流量)和一行返回的数据(服务器到客户端的流量)。每个会话的通信缓冲区的动态扩大处理任何查询或排到最大限度。例如,如果你有BLOB包含了16MB的数据值,你必须有一个至少16通信缓冲区限制(在服务器和客户端)。内置的客户端库的默认最大为1GB,但在服务器的默认最大为1MB。你可以增加这个改变的价值max_allowed_packet在服务器启动参数。看到第5.1.1条,“配置服务器”

MySQL服务器缩小每个通信缓冲区net_buffer_length每个字节后查询。为客户减少直到连接关闭与连接相关的缓冲区的大小不是,此时客户端内存回收。

27.7.1 MySQL C API的实现

MySQL C API是一个基于C的API,C语言编写的客户端应用程序可以使用MySQL服务器通信。客户端程序是指C API的头文件在编译时链接到C API库文件,libmysqlclient,在链接的时候

有两种方法获得的C API的头文件和库建设所需的C API的客户端程序文件:

  • 安装MySQL服务器分配了。

  • 安装一个连接器/ C分布。

对于MySQL服务器和连接器/ C,你可以安装一个二进制分布包含C API文件预先建立的,或者你可以使用一个源分布和建立自己的C API文件。

通常情况下,你安装一个MySQL服务器分布或连接器/ C的分布,但都没有。关于涉及同时MySQL服务器和连接器/ C设施问题的信息,参见第27.7.2,“同时MySQL服务器和连接器/ C设施”

该库文件的名称时要使用的连接C API的客户端应用程序依赖的库类型和平台的分布是建立:

  • 在UNIX(和Unix)系统中,静态库libmysqlclient.a。动态库libmysqlclient.so在大多数Unix系统libmysqlclient.dylib在OS X

  • 在Windows中,静态库mysqlclient.lib和动态库libmysql.dll。Windows发行版还包括libmysql.lib使用动态库,需要一个静态导入库。

    Windows发行版还包括一组调试库。这些具有相同的名称作为nondebug图书馆,但位于lib/debug图书馆你必须使用调试库编译时客户建立使用调试运行。

在Unix上,你还可以看到图书馆,包括_r在名字。在MySQL 5.5中,这些被建立为线程安全的(重入)图书馆分别从非—_ R图书馆为5.5,这两个库都是一样的_r名字是相应的非符号链接—_ R姓名不需要使用_r图书馆例如,如果你使用_配置MySQL获得连接标记,您可以使用_配置MySQL库在所有的情况下,即使对螺纹的客户。没有必要使用mysql_config -- libs_r

27.7.2同时MySQL服务器和连接器/ C装置

MySQL服务器和连接器/ C安装包都提供需要建立和运行MySQL C API的客户端程序文件。本节讨论的时候,可以在同一系统上安装的产品。对于一些封装格式,这是不可能的冲突。对于其他人,都无法将产品安装在同一时间。

这个讨论假定产品类似的包装类型的使用(例如,RPM包为产品)。它并不试图描述包装类型之间的共存(例如,使用一个产品、一个RPM包焦油对于其他的文件包)。它也没有描述的Oracle和那些提供的第三方供应商提供的软件包共存。

如果你安装的产品,可能需要调整你的开发工具和运行环境选择一套头文件和库文件在其他。看到第27.7.4.1,“楼C API的客户端程序”,和第27.7.4.4,运行C API的客户端程序”

焦油压缩文件包的安装目录下,你打开它们。例如,你可以把MySQL服务器和连接器/ C焦油包下/usr/local他们将打开到不同的目录名称不冲突。

Windows MSI安装程序使用自己的安装目录,所以MySQL服务器和连接器/ C安装不冲突。

OS X的DMG包安装相同的父目录下,但在不同的子目录,所以没有冲突。例如:

/usr/local/mysql-5.6.11-osx10.7-x86_64/
/usr/local/mysql-connector-c-6.1.0-osx10.7-x86/

Solaris PKG安装相同的父目录下,但在不同的子目录,所以没有冲突。例如:

/opt/mysql/mysql
/opt/mysql/connector-c

Solaris连接器/ C安装不能创建从系统目录如任何符号链接/usr/bin/ usr / lib目录到安装目录。如果需要安装后必须手动完成。

RPM安装RPM包,有几种类型。MySQL服务器shared发展RPM包类似证的RPM包相应的连接器。这些RPM包类型不能共存,因为MySQL服务器和连接器/ C的RPM包使用相同的安装位置的客户端库相关文件。这意味着以下条件:

  • 如果MySQL服务器shared发展安装RPM包,他们提供的C API的头文件和库文件,不需要安装连接器/ C的RPM包。安装连接器/ C套餐,不管怎样,你必须首先删除相应的MySQL服务器软件包。

  • 安装MySQL服务器的RPM包如果你已经有了连接器/ C的RPM包安装,您必须首先删除连接器/ C的RPM包。

MySQL服务器的RPM包以外shared发展不要用连接器/ C套餐可以安装如果安装连接器/ C冲突。这包括主服务器,包括转mysqld服务器本身

27.7.3示例C API的客户端程序

许多在MySQL源分布的客户都是用C写的,如MySQLmysqladmin,和MySQLShow。如果你正在寻找的例子,演示了如何使用C API,看看这些客户一看:获得源分布和看它client目录看到2.1.2节,“如何让MySQL”

27.7.4构建和运行的C API的客户端程序

以下各节提供建筑的客户端程序,使用C API信息。主题包括编译和连接客户,写线程的客户,和故障运行时的问题。

27.7.4.1大厦C API的客户端程序

本节提供了编译的C程序,使用MySQL C API的指南。

编写Unix的MySQL客户端

这里的例子使用GCC因为编译器。不同的编译器可能会在一些系统是合适的(例如,铿锵在OS X或FreeBSD,或阳光棚在Solaris)。调整的例子是必要的。

您可能需要指定一个-I选择当你编译客户端程序,使用mysql的头文件,以便编译器可以找到他们。例如,如果头文件安装在/usr/local/include mysql,在编译命令使用此选项:

-I/usr/local/mysql/include

MySQL客户端必须连接使用-lmysqlclient在“链接”命令选项。您可能还需要指定一个L选项告诉链接器在哪里找到图书馆。例如,如果库安装在/usr/local/mysql/lib在链接的命令,使用这些选项:

L /usr/local \ lmysqlclient MySQL / lib

路径名称可能不同在你的系统。调整-IL备选办法

为了使它更容易编写UNIX MySQL程序,使用_配置MySQL脚本看到截面位置,”_配置MySQL-编制客户”显示选项

_配置MySQL显示编译或链接所需的选项:

shell> mysql_config --cflags
shell> mysql_config --libs

你可以运行这些命令得到正确的选项,手动添加到编译和链接命令。另外,包括输出_配置MySQL直接在命令行使用引号:

shell> gcc -c `mysql_config --cflags` progname.c
shell> gcc -o progname progname.o `mysql_config --libs`

在Unix系统中,使用默认的链接动态库。链接到静态客户端库相反,添加它的路径名链接命令。例如,如果图书馆位于/usr/local/mysql/lib这样,链接:

内核>gcc -o progname progname.o /usr/local/mysql/lib/libmysqlclient.a

或使用_配置MySQL提供图书馆的名字:

shell> gcc -o progname progname.o `mysql_config --variable=pkglibdir`/libmysqlclient.a

_配置MySQL目前不列出静态链接需要图书馆提供的一种方式,所以可能需要在链接命令附加的库的名称(例如,-lnsl -lsocket在Solaris)。要添加一个思想库,使用_配置MySQL库LDD libmysqlclient.so(或otool L libmysqlclient.dylibOS X)

pkg-config可以用来作为一种替代_配置MySQL获取信息如编译器或链接库需要编译MySQL的应用。例如,以下对命令是等价的:

mysql_config --cflags
pkg-config --cflags mysqlclient

mysql_config --libs
pkg-config --libs mysqlclient

产生静态链接标志,使用此命令:

pkg-config --static --libs mysqlclient

有关更多信息,参见第27.7.4.2,“楼C API的客户端程序,使用pkg-config”

编辑在微软Windows的MySQL客户端

指定的头文件和库文件的位置,使用您的开发环境提供的设施。

建立C API的客户端在Windows,你必须在C的客户端库的链接,以及Windows ws2_32图书馆和图书馆secur32安全插座。

你把你的代码是动态的或静态的C++客户端库。在Windows中,静态库的命名mysqlclient.lib和动态库的命名libmysql.dll。此外,该libmysql.lib静态导入库是使用动态库需要。如果静态库是用C客户端,客户端应用程序必须与Visual Studio用来编译C++客户端库相同的版本编译(这是Visual Studio 2015年为静态C客户端库由Oracle)。

笔记

这个MySQL连接器/ C是一个独立的,在MySQL客户端库,C与MySQL服务器分布替换掉。Oracle建立MySQL连接器/ C目前包含两个版本的静态客户端库,一个Visual Studio 2013和Visual Studio 2015的另一个建造;使用一个匹配的Visual Studio版本来编译你的应用程序。

当使用Oracle的MySQL客户端库建立C(或MySQL连接器/ C),遵循这些规则的时候,你的客户端应用程序连接C运行库:

  • MySQL客户端库的C社区版(或MySQL连接器/ C社区版):

    • 为8.0.0版(或MySQL连接器/ C社区6.1.9之前):

      • 如果链接到静态C++客户端库静态链接到C运行时(使用/MT编译方法

      • 如果链接到动态链接库的C端,无论是静态或动态C运行时(使用/MT/ MD编译方法

    • 版本8.0.1后来(或MySQL连接器/ C社区6.1.10后来):总是动态链接到C运行时(使用/MD编译器选项),无论你是连接到静态或动态C客户端库。同时,目标主机上运行客户端应用程序的需要Visual C可为Visual Studio 2015安装.

  • 对于MySQL C客户端库的商业版本(或MySQL连接器/ C的商业版):

    • 如果链接到静态C++客户端库静态链接到C运行时(使用 /MT编译方法

    • 如果链接到动态链接库的C端,无论是静态或动态C运行时(使用/MT/ MD编译方法

一般来说,当链接到一个静态MySQL C客户端库,客户端库和客户端应用程序必须使用相同的编译器选项时,链接的C运行时,如果你的C++客户端库编译的/MT选项,您的客户机应用程序也应该遵守/吨期权,等等(见在书店里写了一篇文章更多细节)。遵循这个规则,当你建立你自己的静态MySQL客户端库(或MySQL连接器C / C)从源和连接你的客户端应用它。

笔记

调试模式:由于上述规则,你不能构建你的应用程序在调试模式(与/MTd/ MDD编译器选项)和链接的静态C客户端库由甲骨文,这是与调试选项了;相反,你必须建立静态客户端库源的调试选项。

故障排除问题连接到MySQL客户端库

MySQL客户端库包括SSL支持内置。这是不必要的指定-lssl- lcrypto在链接的时候。这样做可能会造成问题,在运行时。

如果链接器不能找到MySQL客户端库,你可能会得到符号开始与未定义的引用误差mysql_如表所示:

/甲氧苄啶/ ccfksdpa。阿`主要功能:/甲氧苄啶/ ccfksdpa。O(文本0xb):对` mysql_init /甲氧苄啶/ ccfksdpa未定义的引用。O(文本0x31):对` mysql_real_connect /甲氧苄啶/ ccfksdpa未定义的引用。O(文本0x69):对` mysql_error“/甲氧苄啶/ ccfksdpa未定义的引用。O(文本0x9a):对` mysql_close '未定义的引用

你应该能够通过增加解决这个问题-Ldir_path -lmysqlclient在你的链接命令结束,在那里dir_path代表路径的目录名的客户端库位于。要确定正确的目录,试试这个命令:

内核>mysql_config --libs

从输出_配置MySQL可能表明,应指定在链接命令以及其他图书馆。您可以包括_配置MySQL在你编译或链接命令使用引号直接输出。例如:

shell> gcc -o progname progname.o `mysql_config --libs`

如果错误发生在链接的时候,floor符号未定义,加入到数学库链接- LM到最后的编译/连接线。同样的,如果你要在你的系统中存在其他函数未定义的引用错误,如connect(),检查该函数的手册页中的问题来确定你应该添加到链接命令库。

如果你有未定义的引用错误,如不在你的系统中存在的功能,这通常意味着你的MySQL客户端库是一个系统,不是100%兼容你的编译:

mf_format.o(.text+0x201): undefined reference to `__lxstat'

在这种情况下,你应该下载最新的MySQL或连接器/ C源分布和编译MySQL客户端库自己。看到2.8节,从“源”安装MySQL,和MySQL连接器/ C开发指南

27.7.4.2大厦C API的客户端程序使用pkg-config

MySQL的发行版中包含了mysqlclient.pc文件,通过提供关于MySQL的配置信息pkg-config命令。这支持pkg-config作为一种替代_配置MySQL获取信息如编译器或链接库需要编译MySQL的应用。例如,以下对命令是等价的:

mysql_config --cflags
pkg-config --cflags mysqlclient

mysql_config --libs
pkg-config --libs mysqlclient

最后pkg-config命令产生动态链接的旗帜。产生静态链接标志,使用此命令:

pkg-config --static --libs mysqlclient

在一些平台上,输出有无--static可能是一样的

笔记

如果pkg-config没有找到MySQL的信息,可能需要设置PKG_CONFIG_PATH环境变量的目录mysqlclient.pc文件的位置,默认情况下通常是pkgconfigMySQL库目录下的目录。例如(适当调整位置):

export PKG_CONFIG_PATH=/usr/local/mysql/lib/pkgconfig # sh, bash, ...setenv PKG_CONFIG_PATH /usr/local/mysql/lib/pkgconfig # csh, tcsh, ...

这个mysqlconfig.pc安装位置可以控制使用INSTALL_PKGCONFIGDIRCMake选项看到第2.8.4节,“MySQL源-配置选项”

这个--variable选择要配置的变量名和显示变量值:

pkg-config --variable=prefix mysqlclient     # installation prefix directorypkg-config --variable=includedir mysqlclient # header file directorypkg-config --variable=libdir mysqlclient     # library directory

看到这些变量的值pkg-config可以显示使用--variable选项,使用这个命令:

PKG - TKG - Print - Print - Print -变量Mysql客户端

你可以使用pkg-config在命令行中使用引号包含的输出,它产生特定的选项。例如,编译和链接MySQL客户端程序,使用pkg-config如下:

gcc -c `pkg-config --cflags mysqlclient` progname.c
gcc -o progname progname.o `pkg-config --libs mysqlclient`

27.7.4.3写C API螺纹的客户端程序

客户端库几乎是线程安全的。最大的问题是,子程序sql/net_serv.cc从套接字读不中断安全。这样做是有思想的,你可能想有自己的闹钟,可以打破长读到服务器。如果你安装了中断处理程序的sigpipe中断处理,插座应该是线程安全的。

为了避免中止程序当连接终止,MySQL块SIGPIPE在第一次调用mysql_library_init()mysql_init(),或mysql_connect()。用你自己的sigpipe第一次调用处理程序,mysql_library_init(),然后安装您的处理程序。

如果未定义的符号发生错误时,将对libmysqlclient客户端库,在大多数情况下,这是因为你没有包括线程库的链接/编译命令。

客户端库是线程安全的每个连接。你可以让两个线程共享同一连接以下注意事项:

  • 多个线程不能发送查询到MySQL服务器在同一时间,在同一个连接。特别是,你必须确保在调用mysql_query()mysql_store_result()在一个线程中,没有其他线程使用相同的连接。你必须在你对一个互斥锁mysql_query()mysql_store_result()电话.后mysql_store_result()返回,锁被释放,其他线程可以查询相同的连接。

    如果你使用POSIX线程,你可以使用pthread_mutex_lock()pthread_mutex_unlock()建立和释放互斥锁

  • 多线程可以访问不同的结果集,通过mysql_store_result()

  • 使用mysql_use_result(),你必须确保没有其他线程使用同一连接到结果集关闭。然而,这真的是最好的螺纹客户共享同一连接使用mysql_store_result()

你需要知道以下的如果你有一个线程没有创建MySQL数据库的连接是调用MySQL功能:

当你打电话mysql_init(),MySQL创建一个被调试线程的线程库使用特定的变量(等)。如果你打电话给一个MySQL函数线程之前称mysql_init(),线程不到位有必要的线程特定的变量,你可能最终与核心转储迟早。为了避免这些问题,你必须做到以下几点:

  1. 呼叫mysql_library_init()任何其他的MySQL函数之前。它不是线程安全的,所以叫它之前被创建的线程,或保护的呼吁与互斥。

  2. 安排mysql_thread_init()被称为线程调用任何MySQL函数之前早。如果你打电话mysql_init(),它会调用mysql_thread_init()为你.

  3. 在线程调用mysql_thread_end()在调用pthread_exit()。这使得通过MySQL线程特定的变量使用的内存。

前注意事项mysql_init()也适用于mysql_connect(),这要求mysql_init()

27.7.4.4运行C API的客户端程序

如果升级后,你的经验与编译客户端程序问题,如Commands out of sync或意外的核心转储程序是编译使用旧头或库文件。在这种情况下,检查的日期MySQL的文件和libmysqlclient.a用于编译是否从新MySQL分配库。如果没有,编译程序与新的头文件和库。重新编译也可以编译对共享的客户端库如果库的主版本号的程序必要的改变(例如,从libmysqlclient.so.17libmysqlclient.so.18

大客户库的版本确定兼容性。(例如,为libmysqlclient.so.18.1.0,主要的版本是18。)因此,图书馆随新版本的MySQL是下降的,有相同的大数老版本替换。只要大库的版本是一样的,你可以升级的图书馆和旧的应用程序应该继续使用它。

发生在运行时,当您尝试执行一个MySQL程序可能未定义的引用误差。如果这些错误指定符号开始mysql_或表明libmysqlclient图书馆找不到,那就意味着你的系统无法找到共享libmysqlclient.so图书馆解决这个问题的办法是告诉你的系统来搜索共享库所在的目录下,图书馆位于。使用下面的方法都是适合你的系统:

  • 添加的目录的路径libmysqlclient.so坐落于_ LD _库路径LD_LIBRARY环境变量

  • 在OS X上,添加的目录的路径libmysqlclient.dylib坐落于dyld _ _库路径环境变量

  • 复制的共享库文件(如libmysqlclient.so)一些目录,由系统搜索,如/ lib,并通过执行更新共享图书信息ldconfig。一定要把所有的相关文件。一个共享库可能下几个名字存在,使用符号链接来提供备用名称。

27.7.4.5 C API的服务器和客户端库版本

在MySQL服务器版本的字符串和数值表可在编译时的值MYSQL_SERVER_VERSION_ _ MySQL版本ID宏,以及在运行时的值mysql_get_server_info()mysql_get_server_version()功能.

MySQL客户端库的版本取决于分布提供了库的类型:

  • MySQL的分布,客户端库版本的MySQL版本。这个版本的字符串和数值表可在编译时的值MYSQL_SERVER_VERSION_ _ MySQL版本ID宏,以及在运行时的值mysql_get_client_info()mysql_get_client_version()功能.

    这个LIBMYSQL_VERSION_ libmysql _版本ID宏有相同的价值观MYSQL_SERVER_VERSION_ _ MySQL版本ID这两套宏可以交替使用。

  • 连接器/ C分布,客户端库的版本是连接器/ C版。这个版本的字符串和数值表可在编译时的值LIBMYSQL_VERSION_ libmysql _版本ID宏,以及在运行时的值mysql_get_client_info()mysql_get_client_version()功能.

    这个MYSQL_SERVER_VERSION_ _ MySQL版本ID宏表示字符串和数字形式的MySQL版本的连接器/ C分布的基础。

27.7.5 C API的数据结构

本节介绍的C API的数据结构比其他那些用于编制报表或复制流接口。关于这些,看第27.7.9,“C API编写报表数据结构”,和第27.7.15,”C API的二进制日志数据结构”

  • MYSQL

    这种结构是一个数据库连接句柄。它被用于几乎所有的MySQL函数。不要试图复制一个MYSQL结构。有没有保证,这样的副本将被使用。

  • MYSQL_RES

    这种结构代表一个返回行的查询结果(SELECTSHOWDESCRIBEEXPLAIN)。从查询返回的信息称为结果集在remainder本节。

  • MYSQL_ROW

    这是一种类型安全的代表一行数据。它是目前为数字节字符串数组实现。(你不能如果字段值可以包含二进制数据,因为这些值可能包含空字节内部。处理这些空终止字符串)通过电话也行mysql_fetch_row()

  • MYSQL_FIELD

    这个结构包含元数据:一场信息,如字段的名称、类型、大小。它的成员有更详细的描述在本章的后面。你可以得到MYSQL_FIELD通过调用每个字段的结构mysql_fetch_field()反复。字段的值不是这个结构的一部分;它们都包含在一个MySQL _行结构

  • MYSQL_FIELD_OFFSET

    这是一种类型安全表示偏移到一个MySQL字段列表。(用mysql_field_seek()。)偏移的行内的场数,从零。

  • my_ulonglong

    用于行数和类型mysql_affected_rows()mysql_num_rows(),和mysql_insert_id()。这类提供了一系列的1.84e19

    一些函数,返回一个行数使用该类型返回1表示错误条件或例外的无符号值。你可以检查1通过比较返回值(my_ulonglong)-1(或我的最爱等价,which is)。

    在一些系统中,试图打印类型的值my_ulonglong不工作。打印这样的值,将其转换为无符号长与使用%lu打印格式。例子:

    printf(“行数:%lu \n”(长整型)mysql_num_rows(结果));
  • my_bool

    在布尔型,for that are真实收益(nonzero)或FALSE(零)。的my_bool类型之前使用MySQL 8。在MySQL 8中,使用布尔intC型相反

    笔记

    的变化my_bool布尔意味着mysql.h头文件需要一个C或C99编译器编译。

这个MYSQL_FIELD结构包含以下列表中的成员了。该定义适用于主要用于柱等所产生的结果集SELECT声明.mysql_field结构也用于提供元数据OUTINOUT从存储过程参数执行使用准备返回CALL声明.这样的参数,有些结构的成员有不同的列值的意义。

  • char * name

    该字段的名称,作为一个零终止字符串。如果该字段是给定一个别名的AS条款的价值姓名是别名。一个程序的参数,参数名称。

  • char * org_name

    该字段的名称,作为一个零终止字符串。别名是忽略。表达式的值是一个空字符串。一个程序的参数,参数名称。

  • char * table

    包含这一领域的表的名称,如果它不是一个计算字段。对于计算字段的table值是一个空字符串。如果列选择一个视图,名称的视图。如果表或视图是一个别名的AS条款的价值是别名。对于一个UNION,的值是空字符串。一个程序参数,程序的名字。

  • char * org_table

    该表的名称,作为一个零终止字符串。别名是忽略。如果列选择一个视图,org_table名称的视图。如果该列是从派生表,org_table名称基表。如果一个派生表将视图,org_table还是名字的基表。如果列的表达式,org_table为空字符串。对于一个UNION,的值是空字符串。一个过程参数值的程序名称。

  • char * db

    那场来自数据库的名称,作为一个零终止字符串。如果字段计算字段,db是一个空字符串。对于一个UNION,的值是空字符串。一个程序的参数,包含程序的数据库的名称。

  • char * catalog

    目录名称。这个值是永远"def"

  • char * def

    此字段的默认值为空字符串。这是只有当你使用mysql_list_fields()

  • unsigned long length

    该字段的宽度。这对应于显示的长度,以字节为单位。

    服务器确定length在生成结果集的价值,所以这是一个数据类型能够保持最大值从结果柱所要求的最小长度,在事先不知道的实际值,将查询的结果集的产生。

  • unsigned long max_length

    最大宽度的字段的结果集(在最长的字段值的字节长度的行实际上在结果集)。如果你使用mysql_store_result()mysql_list_fields()这包含最大长度for the field。如果你使用mysql_use_result(),这个变量的值是零

    价值max_length是在结果的值的字符串表示的长度设置。例如,如果你检索FLOAT柱和-12.345max_length七(长度'-12.345'

    如果你正在使用的准备好的语句,max_length未设置默认因为协议的二进制值的长度取决于类型的值的结果集。(见第27.7.9,“C API编写报表数据结构”如果你想要的。)max_length价值无论如何,使stmt_attr_update_max_length选项mysql_stmt_attr_set()的长度将你打电话时mysql_stmt_store_result()。。。。。。。(这第27.7.11.3,“mysql_stmt_attr_set()”,和“27.7.11.28 MySQL支撑截面,_ _商店_ result()”。)

  • unsigned int name_length

    长度name

  • unsigned int org_name_length

    长度org_name

  • unsigned int table_length

    长度table

  • unsigned int org_table_length

    长度org_table

  • unsigned int db_length

    长度db

  • unsigned int catalog_length

    长度catalog

  • unsigned int def_length

    长度def

  • unsigned int flags

    位场,describe the旗。《flags价值可以有零个或更多的位设置,如下表所示。

    标志值标志的说明
    NOT_NULL_FLAG字段不能NULL
    PRI_KEY_FLAG字段是主键的一部分
    UNIQUE_KEY_FLAG场是一个独特的关键部分
    MULTIPLE_KEY_FLAG本场是唯一的关键部分
    UNSIGNED_FLAG现场有UNSIGNED属性
    ZEROFILL_FLAG现场有ZEROFILL属性
    BINARY_FLAG现场有BINARY属性
    AUTO_INCREMENT_FLAG现场有AUTO_INCREMENT属性
    ENUM_FLAG字段是一个ENUM
    SET_FLAG场是一个SET
    BLOB_FLAG场是一个BLOBTEXT(不推荐使用)
    TIMESTAMP_FLAG场是一个TIMESTAMP(不推荐使用)
    NUM_FLAG字段是数值;见附加说明如下表
    NO_DEFAULT_VALUE_FLAG现场没有默认值;见附加说明如下表

    这些标志指示数据类型信息和被取代或配合使用MYSQL_TYPE_xxx中的价值场>型构件描述:

    • 检查BLOBTIMESTAMP值,检查是否类型MYSQL_TYPE_BLOBMySQL _型_时间戳。(The)BLOB_FLAGtimestamp_flag标志是不必要的。)

    • ENUMSET返回的字符串值。对于这些,检查的类型MYSQL_TYPE_STRING和,_标志枚举SET_FLAG标志设置在旗帜价值

    NUM_FLAG表明,一列数字。这包括一个类型的列MySQL _ _ decimal类型MYSQL_TYPE_NEWDECIMALMySQL _型_小MYSQL_TYPE_SHORTmysql_type_longMYSQL_TYPE_FLOATmysql_type_doubleMYSQL_TYPE_NULLMYSQL AR TRE TS LongongMYSQL_TYPE_INT24,和MySQL _型_年

    NO_DEFAULT_VALUE_FLAG表明,一列没有默认在定义条款。这不适用于NULL列(因为这样的列有一个默认的无效的or to)AUTO_INCREMENT柱(有一个隐含的默认值)。

    下面的例子说明了一个典型的使用flags价值:

    如果(场->国旗和not_null_flag)printf(“字段不能为空”);

    你可以使用下表中显示确定的布尔状态方便的宏flags价值

    标志的地位描述
    IS_NOT_NULL(flags)如果这个字段定义为NOT NULL
    IS_PRI_KEY(flags)如果该字段是主键
    IS_BLOB(flags)如果这场是一个BLOBTEXT(弃用;试验场>型相反)
  • unsigned int decimals

    数字字段小数点后的位数,小数秒的精度和时间领域。

  • unsigned int charsetnr

    身份证号码显示该字段的字符集和整理对。

    通常,在结果集的字符值转换为字符集表示的character_set_results可变系统。在这情况下,charsetnr对应的字符集的变量表示。字符集转换可以被设置character_set_results无效的。在这种情况下,charsetnr对应设置原表列或表达式的字符。参见10.4节,“连接字符集和Collations”

    区分二进制和非二进制数据之间的字符串数据类型,检查是否charsetnr值为63。如果是这样的话,人物的设置二元的,这表明二进制而不是二进制数据。这使您可以区分BINARYCHARVARBINARYVARCHAR,和BLOB类型从TEXT类型

    charsetnr价值观是那些显示在相同的身份证件列的SHOW COLLATION声明或身份证件列的INFORMATION_SCHEMACOLLATIONS表你可以使用这些信息来源看,字符集和整理的具体charsetnr值表示:

    mysql> SHOW COLLATION WHERE Id = 63;
    +-----------+---------+----+---------+----------+---------+
    | Collation | Charset | Id | Default | Compiled | Sortlen |
    +-----------+---------+----+---------+----------+---------+
    | binary    | binary  | 63 | Yes     | Yes      |       1 |
    +-----------+---------+----+---------+----------+---------+
    
    mysql> SELECT COLLATION_NAME, CHARACTER_SET_NAME
        -> FROM INFORMATION_SCHEMA.COLLATIONS WHERE ID = 33;
    +-----------------+--------------------+
    | COLLATION_NAME  | CHARACTER_SET_NAME |
    +-----------------+--------------------+
    | utf8_general_ci | utf8               |
    +-----------------+--------------------+
    
  • enum enum_field_types type

    “类型”字段。《type值可以是一体的MySQL _型_下表中显示的符号

    类型的值类型描述
    MYSQL_TYPE_TINYTINYINT领域
    MYSQL_TYPE_SHORTSMALLINT领域
    MYSQL_TYPE_LONGINTEGER领域
    MYSQL_TYPE_INT24MEDIUMINT领域
    MYSQL_TYPE_LONGLONGBIGINT领域
    MYSQL_TYPE_DECIMALDECIMALNUMERIC领域
    MYSQL_TYPE_NEWDECIMAL精密的数学DECIMALNUMERIC
    MYSQL_TYPE_FLOATFLOAT领域
    MYSQL_TYPE_DOUBLEDOUBLEREAL领域
    MYSQL_TYPE_BITBIT领域
    MYSQL_TYPE_TIMESTAMPTIMESTAMP领域
    MYSQL_TYPE_DATEDATE领域
    MYSQL_TYPE_TIMETIME领域
    MYSQL_TYPE_DATETIMEDATETIME领域
    MYSQL_TYPE_YEARYEAR领域
    MYSQL_TYPE_STRINGCHARBINARY领域
    MYSQL_TYPE_VAR_STRINGVARCHARVARBINARY领域
    MYSQL_TYPE_BLOBBLOBTEXT场(使用max_length确定最大长度)
    MYSQL_TYPE_SETSET领域
    MYSQL_TYPE_ENUMENUM领域
    MYSQL_TYPE_GEOMETRY空间场
    MYSQL_TYPE_NULLNULL型场

    这个MYSQL_TYPE_TIME2MySQL _型_ datetime2,和MYSQL_TYPE_TIMESTAMP2)类型代码仅用于在服务器端。客户看到的MySQL _型_时MYSQL_TYPE_DATETIME,和MySQL _型_时间戳

    你可以使用IS_NUM()宏观检验领域有数字型。通过类型价值IS_NUM()和它对如果字段是数字真实:

    如果(is_num(场->型))printf(“字段是数值\n”);

    ENUMSET返回的字符串值。对于这些,检查的类型MYSQL_TYPE_STRING和,_标志枚举SET_FLAG标志设置在旗帜价值

27.7.6 C API函数概述

下面的列表总结了C API提供的功能。为更详细的描述,参见27.7.7”型,C API函数》

应用程序应该使用这个大纲与MySQL:

  1. 初始化MySQL客户端库调用mysql_library_init()

  2. 初始化一个连接处理程序通过调用mysql_init()通过调用连接到服务器mysql_real_connect()

  3. 问题SQL语句和过程结果。(下面的讨论提供了更多的信息关于如何做到这一点。)

  4. 通过调用关闭MySQL服务器的连接mysql_close()

  5. 通过调用MySQL客户端库的使用mysql_library_end()

打电话的目的mysql_library_init()mysql_library_end()是提供MySQL客户端库的初始化和终止。为与客户端库链接的应用程序,它们提供了改进的内存管理。如果你不打电话mysql_library_end()一个内存块的分配,仍然是。(这不增加的应用,使用的内存量但一些内存泄漏探测器会抱怨。)

在nonmultithreaded环境,调用mysql_library_init()可以省略,因为mysql_init()将自动调用它时。然而,mysql_library_init()在多线程环境中不是线程安全的,因此无论是mysql_init(),这要求mysql_library_init()。你必须调用mysql_library_init()产卵前或其他任何线程,使用互斥锁保护的呼唤,你是否调用mysql_library_init()或间接通过mysql_init()。这应该是任何其他的客户端库调用之前完成。

连接到服务器,调用mysql_init()初始化一个连接句柄,然后调用mysql_real_connect()与处理程序(以及其他信息,如主机名、用户名和密码)。在连接,mysql_real_connect()重新连接国旗(部分的MYSQL结构)的一个值在旧版本的API中,或0在最新的版本。一个值这个标志表示如果因为失去而进行的一项声明不能,尝试重新连接到服务器之前放弃。你可以使用MYSQL_OPT_RECONNECT选项mysql_options()控制重行为。当您完成连接,调用mysql_close()终止它

而一个连接是活跃的,客户端可以向服务器发送SQL语句的使用mysql_query()mysql_real_query()。这两者之间的区别是:mysql_query()预计该查询被指定为空字符串而mysql_real_query()预计一个字串。如果字符串包含二进制数据(可能包括零字节),你必须使用mysql_real_query()

每个非SELECT查询(例如,INSERTUPDATEDELETE),你可以找到多少行被改变(影响)通过调用mysql_affected_rows()

SELECT查询,您检索选定的行为结果集。(注意,有些语句是SELECT像在他们返回行。这些措施包括SHOWDESCRIBE,和EXPLAIN。同样的方式对待这些语句SELECT语句。)

有一个客户处理结果集的两种方式。方法之一是检索整个结果集一次调用mysql_store_result()。这个函数从服务器获取返回的查询和存储在客户端的所有行。二是为客户行结果集检索调用启动排mysql_use_result()。该函数初始化检索,但实际上并没有从服务器上获取任何行。

在这两种情况下,你通过调用访问行mysql_fetch_row()。与mysql_store_result()mysql_fetch_row()访问先前已从服务器读取的行。与mysql_use_result()mysql_fetch_row()其实从服务器检索的行。对每一行中的数据大小信息,可以通过调用mysql_fetch_lengths()

在你完成了一个结果集,叫mysql_free_result()释放内存使用它

两检索机制是互补的。选择的方法是最适合每个客户端应用程序。在实践中,客户往往使用mysql_store_result()更常见的

一个优势mysql_store_result()那是因为排都取到客户端,你不仅可以访问排顺序,你可以在结果中来回移动使用mysql_data_seek()mysql_row_seek()要改变当前行位置在结果集。你也可以找出有多少行被调用mysql_num_rows()。另一方面,对存储器的要求mysql_store_result()可能很高大的结果集,你更可能会遇到内存不足的情况。

一个优势mysql_use_result()是客户要求的结果集的内存少是因为它保持在一个时间只有一个排(因为有更少的内存分配的开销,mysql_use_result()可以更快)。缺点是你必须处理每一行迅速,避免服务器,你没有随机访问行结果集内(你只能访问行顺序),并在结果集的行数是未知的直到你收回他们所有的。此外,你必须检索所有行,即使你确定中检索,你发现你要寻找的资料。

API可以让客户做出适当的语句(检索行,只在必要时)不知道是否该声明是一个SELECT。你可以通过调用mysql_store_result()之后的每一个mysql_query()(或mysql_real_query())。如果结果集调用成功,声明一个SELECT你可以读取行。如果结果集呼叫失败,呼叫mysql_field_count()确定的结果其实是可以预料到的。如果mysql_field_count()返回0,声明没有返回数据(表明它是一个INSERTUPDATEDELETE,等等),而不是希望返回行。如果mysql_field_count()非零,声明要返回的行,但不。这说明了SELECT失败。看到描述mysql_field_count()例如,这是如何做到的。

mysql_store_result()mysql_use_result()使您能够获得组成结果集的字段信息(字段名称和类型,数量,等等)。您可以访问字段信息依次行内称mysql_fetch_field()反复,或场数行内称mysql_fetch_field_direct()。当前场的光标位置可以改变通过调用mysql_field_seek()。设置光标的领域影响随后调用mysql_fetch_field()。你也可以把信息领域的一次调用mysql_fetch_fields()

用于检测和报告错误,MySQL提供了通过获取错误信息mysql_errno()mysql_error()功能.这些返回的错误代码或错误的最新功能,可以调用成功或失败的消息,使您能够确定错误发生时,它是什么。

12.7 c c API function defunction

27.7.7.1 mysql_affected_rows()
27.7.7.2 mysql_autocommit()
27.7.7.3 mysql_change_user()
27.7.7.4 mysql_character_set_name()
27.7.7.5 _ mysql close()
27.7.7.6 _承诺(MySQL)
27.7.7.7 mysql_connect()
27.7.7.8 mysql_create_db()
MySQL的日期27.7.7.9 _ _ seek()
27.7.7.10 MySQL _ debug(的)
27.7.7.11 _ _ MySQL分贝(拖放)
MySQL的转储调试27.7.7.12 _ _ _ info()
27.7.7.13 _ EDF(MySQL)
_ 27.7.7.14 mysql errno()
27.7.7.15 mysql_error()
MySQL的字符串27.7.7.16 _ _(Escape)
27.7.7.17 mysql_fetch_field()
27.7.7.18 MySQL直接取_ _ _(场)
27.7.7.19 mysql_fetch_fields()
27.7.7.20 mysql_fetch_lengths()
27.7.7.21 mysql_fetch_row()
27.7.7.22 MySQL _场_ count()
27.7.7.23 MySQL _场_ seek()
27.7.7.24 MySQL _告诉_(场)
27.7.7.25 mysql_free_result()
27.7.7.26 mysql_get_character_set_info()
27.7.7.27 MySQL客户端_ _ _ get info()
27.7.7.28 MySQL客户端版本_ _ _ get()
27.7.7.29 MySQL主机信息_ _ _ get()
27.7.7.30 _ _ MySQL选项(get)
27.7.7.31 mysql_get_proto_info()
27.7.7.32 mysql_get_server_info()
27.7.7.33 MySQL服务器版本_ _ _ get()
27.7.7.34 MySQL _ get _ _ cipher(SSL)
27.7.7.35 mysql_hex_string()
27.7.7.36 MySQL _(信息)
27.7.7.37 mysql_init()
27.7.7.38 mysql_insert_id()
27.7.7.39 MySQL _杀(的)
27.7.7.40 MySQL _图书馆_ end()
27.7.7.41 mysql_library_init()
27.7.7.42 mysql_list_dbs()
27.7.7.43 mysql_list_fields()
27.7.7.44 mysql_list_processes()
27.7.7.45 mysql_list_tables()
27.7.7.46 mysql_more_results()
27.7.7.47 mysql_next_result()
27.7.7.48 mysql num字段(_ _)
27.7.7.49 mysql_num_rows()
7.7.50 Mysql Options()
27 . 7.7.51 MysQL Options4()
27.7.7.52 mysql_ping()
27.7.7.53 mysql_query()
27.7.7.54 mysql real connect()_ _
mysql real _ _ 27.7.7.55 _ Escape(字符串)
27.7.7.56 mysql_real_escape_string_quote()
27.7.7.57 mysql_real_query()
27.7.7.58 _刷新(MySQL)
27.7.7.59 mysql_reload()
27.7.7.60 MySQL _ _ connection(复位)
重置MySQL服务器27.7.7.61 _ _ _公共_ key()
27.7.7.62 mysql_result_metadata()
27.7.7.63 mysql_rollback()
27.7.7.64 MySQL _行_ seek()
27.7.7.65 _行_(MySQL)。
27.7.7.66 mysql_select_db()
MySQL服务器27.7.7.67 _ _ end()
27.7.7.68 mysql_server_init()
27.7.7.69 mysql_session_track_get_first()
27.7.7.70 mysql_session_track_get_next()
27.7.7.71 mysql_set_character_set()
27.7.7.72 mysql_set_local_infile_default()
27.7.7.73 mysql_set_local_infile_handler()
27.7.7.74 mysql_set_server_option()
27.7.7.75 mysql_shutdown()
27.7.7.76 MySQL _ SQLSTATE(的)
27.7.7.77 MySQL _ _集(SSL)
27.7.7.78 MySQL _ stat()
27.7.7.79 mysql result()_ _商店
27.7.7.80 mysql_thread_id()
27.7.7.81 mysql_use_result()
27.7.7.82 mysql_warning_count()

在这里的描述、参数或返回值NULL方法无效的在C语言编程的感觉,而不是MySQLNULL价值

函数返回一个值,通常返回一个指针或整数。除非另有说明,函数返回一个指针,返回一个非—NULL表示成功或价值无效的表示错误的值,并返回一个整数返回零表示成功或非零表示错误功能。请注意,非零只意味着。除非函数描述说,否则,不与非零的值测试:

if (result)                   /* correct */
    ... error ...

if (result < 0)               /* incorrect */
    ... error ...

if (result == -1)             /* incorrect */
    ... error ...

当一个函数返回一个错误的错误的功能描述部分列举错误的可能类型。你可以找到这些发生的mysql_errno()。错误的字符串表示形式可以通过调用mysql_error()

27.7.7.1 mysql_affected_rows()

my_ulonglong mysql_affected_rows(MYSQL *mysql)

描述

mysql_affected_rows()可执行语句后立即打电话mysql_query()mysql_real_query()。它返回的行数的改变,删除或插入,最后一句好像是一个UPDATEDELETE,或INSERT。为SELECT声明,mysql_affected_rows()就像mysql_num_rows()

UPDATE语句所影响的行的值是默认的行数上的变化。如果您指定的client_found_rows国旗mysql_real_connect()当连接到mysqld,受影响的行的值的行数建立是的,相匹配;WHERE条款.

REPLACE语句所影响的行的值是2,如果新排取代旧的行,因为在这种情况下,有一行被插入后的副本被删除。

INSERT ... ON DUPLICATE KEY UPDATE语句所影响的行的值,每行1如果行插入新的一行,2如果现有的行被更新,0如果一个现有的行设置为其当前值。如果您指定的client_found_rows国旗,受影响的行的值为1(而不是0)如果一个现有的行设置为其当前值。

下面的一个CALL一个存储过程语句,mysql_affected_rows()返回,它将在程序执行的最后一个语句的值,或如果这样的语句将返回-1。在程序中,你可以使用ROW_COUNT()在SQL级获得受影响的行的值对于个人陈述。

mysql_affected_rows()返回一个范围广泛的陈述一个有意义的值。详情见描述ROW_COUNT()进入12.14节,“信息功能”

返回值

一个大于零的整数,指示受影响的行数或检索。零表示没有记录被更新为一个UPDATE声明,不匹配的行哪里在查询或任何查询尚未执行的条款。1表示查询返回一个错误或者说,一个SELECT查询,mysql_affected_rows()之前打电话叫mysql_store_result()

因为mysql_affected_rows()返回一个无符号值,你可以检查1通过比较返回值我的最爱(或(my_ulonglong)~0等价,which is)。

错误

例子
char *stmt = "UPDATE products SET cost=cost*1.25
              WHERE group=10";
mysql_query(&mysql,stmt);
printf("%ld products updated",
       (long) mysql_affected_rows(&mysql));

27.7.7.2 mysql_autocommit()

bool mysql_autocommit(MYSQL *mysql, bool mode)

描述

如果设置自动提交模式mode1、如果模式0

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.3 mysql_change_user()

bool mysql_change_user(MYSQL *mysql, const char *user, const char *password, const char *db)

描述

改变指定的数据库用户和原因db成为默认的(电流)指定的数据库连接MySQL。在随后的查询,这个数据库是默认的表引用,包括没有明确的数据库名。

mysql_change_user()失败如果连接的用户不能通过认证或没有权限使用数据库。在这种情况下,用户和数据库都没有改变。

通过db参数无效的如果你不希望有一个默认的数据库。

此功能重置会话状态好像是做了一个新的连接和reauthenticated。(见第27.7.24,“C API自动重联控制”它总是执行。)ROLLBACK任何交易活跃,关闭掉所有的临时表,并开启所有的锁表。会议系统变量重置到相应的全局系统变量的值。准备好的语句释放HANDLER变量是封闭的。锁收购GET_LOCK()被释放。这些影响会发生,即使用户没有改变。

重置连接状态在一个更轻的方式没有改变用户的使用mysql_reset_connection()

返回值

零成功。非零,如果发生了一个错误。

错误

同样的,你可以从mysql_real_connect(),加上:

例子
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}

27.7.7.4 mysql_character_set_name()

const char *mysql_character_set_name(MYSQL *mysql)

描述

为当前连接返回默认字符集名称。

返回值

默认的字符集名称

错误

27.7.7.5 _ mysql close()

void mysql_close(MYSQL *mysql)

描述

关闭先前打开的连接mysql_close()同时释放连接句柄指向的MySQL如果处理程序是自动分配的mysql_init()mysql_connect()

返回值

错误

27.7.7.6 _承诺(MySQL)

bool mysql_commit(MYSQL *mysql)

描述

提交当前事务

这个功能的作用是本课题的价值completion_type系统变量。特别是,如果有价值completion_type发布(2)、服务器进行发布终止交易后关闭客户端连接。呼叫mysql_close()从客户程序从客户端关闭连接。

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.7 mysql_connect()

MYSQL *mysql_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd)

描述

此功能已过时。使用mysql_real_connect()相反

mysql_connect()尝试建立一个MySQL数据库引擎运行在连接主办mysql_connect()必须成功完成之前,你可以执行任何其他的API函数,除了mysql_get_client_info()

参数的含义是相同的相应参数mysql_real_connect()与不同的连接参数可以无效的。在这种情况下,C API的连接结构分配内存自动释放你叫mysql_close()。这种方法的缺点是不能如果连接失败检索错误信息。(从得到错误信息mysql_errno()mysql_error(),你必须提供一个有效的MySQL用。)

返回值

一样的mysql_real_connect()

错误

一样的mysql_real_connect()

27.7.7.8 mysql_create_db()

int mysql_create_db(MYSQL *mysql, const char *db)

描述

创建数据库命名的db参数.

此功能已过时。使用mysql_query()发出一个SQLCREATE DATABASE语句

返回值

零成功。非零,如果发生了一个错误。

错误
例子
if(mysql_create_db(&mysql, "my_database"))
{
   fprintf(stderr, "Failed to create new database.  Error: %s\n",
           mysql_error(&mysql));
}

MySQL的日期27.7.7.9 _ _ seek()

void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset)

描述

求任意排在查询结果集。这个offset价值是一个行数。指定的范围值mysql_num_rows(result)-1

此功能需要的结果集的结构包含查询的整个结果,所以mysql_data_seek()仅可用于结合mysql_store_result(),不mysql_use_result()

返回值

错误

27.7.7.10 MySQL _ debug(的)

void mysql_debug(const char *debug)

描述

做一个DBUG_PUSH用给定的字符串mysql_debug()采用弗莱德鱼调试库。要使用此功能,您必须编写的客户端库支持调试。看到第28.5.3,“该计划”

返回值

错误

例子

电话在这里显示导致客户端库生成一个跟踪文件/tmp/client.trace在客户机:

_调试MySQL(T O / D:TMP / client.trace”);

27.7.7.11 _ _ MySQL分贝(拖放)

int mysql_drop_db(MYSQL *mysql, const char *db)

描述

滴的数据库命名为db参数.

此功能已过时。使用mysql_query()发出一个SQLDROP DATABASE语句

返回值

零成功。非零,如果发生了一个错误。

错误
例子
if(mysql_drop_db(&mysql, "my_database"))
  fprintf(stderr, "Failed to drop the database: Error: %s\n",
          mysql_error(&mysql));

MySQL的转储调试27.7.7.12 _ _ _ info()

int mysql_dump_debug_info(MYSQL *mysql)

描述

指示服务器写入调试信息错误日志。连接的用户必须有SUPER特权

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.13 _ EDF(MySQL)

bool mysql_eof(MYSQL_RES *result)

描述

此功能已过时mysql_errno()mysql_error()可以用来代替

mysql_eof()确定一个结果集的最后一行被读取。

如果你得到一个结果集从一个成功的电话mysql_store_result()在一次操作中,客户端接收到完整的集。在这种情况下,一个无效的返回mysql_fetch_row()总是意味着结果集都已结束,这是不必要的电话mysql_eof()。当使用mysql_store_result()mysql_eof()始终返回true

另一方面,如果你使用mysql_use_result()启动一个结果集检索,从服务器取得一个接一个打电话给你是组的行mysql_fetch_row()反复。因为发生在连接过程中可能的错误,一个无效的返回值mysql_fetch_row()不一定是结果集的最后达到正常。在这种情况下,你可以使用mysql_eof()确定发生了什么mysql_eof()返回一个非零值,如果结果集的最后达到零如果发生错误。

从历史上看,mysql_eof()在标准的MySQL错误功能mysql_errno()mysql_error()。因为这些误差函数提供了相同的信息,它们的使用是首选mysql_eof(),这是不可取的。(事实上,他们提供了更多的信息,因为mysql_eof()只返回一个布尔值,而误差函数指示错误的原因时,一个发生。)

返回值

零成功。非零,如果结果集都已结束。

错误

例子

下面的示例演示如何使用mysql_eof()

mysql_query(&mysql,"SELECT * FROM some_table");result = mysql_use_result(&mysql);while((row = mysql_fetch_row(result))){    // do something with data}if(!mysql_eof(result))  // mysql_fetch_row() failed due to an error{    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));}

然而,你可以用标准的MySQL误差函数达到同样的效果:

mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(mysql_errno(&mysql))  // mysql_fetch_row() failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}

_ 27.7.7.14 mysql errno()

unsigned int mysql_errno(MYSQL *mysql)

描述

指定的连接mysqlmysql_errno()返回最近调用的API函数,可以成功或失败,错误代码。一个零意味着没有发生错误返回值。客户端错误消息号在MySQL上市errmsg。H头文件。服务器错误消息号列mysqld_error.h。错误也列在附录B,错误,错误代码,及常见问题

笔记

如一些功能mysql_fetch_row()不设置mysql_errno()如果他们成功了。一条经验法则是,所有的功能,必须要求服务器信息复位mysql_errno()如果他们成功了

MySQL特定的错误号返回mysql_errno()不同于SQLSTATE值返回mysql_sqlstate()。例如,在MySQL客户端程序显示错误使用下面的格式,在1146是的mysql_errno()价值和42s02’。”是相应的mysql_sqlstate()价值:

内核&#62;SELECT * FROM no_such_table;错误1146(42s02):表”测试。no_such_table”不存在
返回值

在过去的一个错误代码值mysql_xxx()电话,如果失败。零表示没有错误发生。

错误

27.7.7.15 mysql_error()

const char *mysql_error(MYSQL *mysql)

描述

指定的连接mysqlmysql_error()返回一个空字符串包含最近调用API函数失败的错误信息。如果一个函数没有失败,返回值mysql_error()可能是以前的错误或显示没有错误空字符串。

一条经验法则是,所有的功能,必须要求服务器信息复位mysql_error()如果他们成功了

功能复位mysql_error(),两试验可用于检查错误:

如果(* mysql_error(和MySQL)){ //发生错误}如果(mysql_error(和MySQL)[ 0 ]){ //发生错误}

客户的错误消息的语言可以通过重新编译MySQL客户端库的变化。你可以选择几种不同的语言错误消息。看到第4,“设置错误消息的语言”

返回值

一个null结尾的字符串,描述错误。如果没有错误发生,一个空字符串。

错误

MySQL的字符串27.7.7.16 _ _(Escape)

笔记

不使用此功能mysql_escape_string()没有论据,使它能够尊重当前字符集或引用的上下文。使用mysql_real_escape_string_quote()相反

27.7.7.17 mysql_fetch_field()

MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)

描述

返回一个结果集作为一个列的定义MYSQL_FIELD结构。调用这个函数来检索结果中重复所有列设置信息。mysql_fetch_field()退货无效的当没有更多的领域是左。

元数据可选的连接,这个函数返回NULLresultset_metadata系统变量设置为。检查结果集的元数据,使用mysql_result_metadata()功能。有关管理结果集元数据转换的详细信息,参见第27.7.23,”C API的可选的结果集元数据

mysql_fetch_field()复位返回信息的第一场每次执行一个新的SELECT查询。外地回来的mysql_fetch_field()还受电话mysql_field_seek()

如果你叫mysql_query()执行SELECT桌上却没有叫mysql_store_result(),MySQL返回默认块长度(8KB)如果你打电话mysql_fetch_field()要求一个长度BLOB场。(对8KB大小是因为mysql不知道的最大长度为BLOB。这应该是可配置的时间。)一旦你检索结果集,max_length场&#62;包含在特定查询此列的最大值的长度。

返回值

这个MYSQL_FIELD对于当前柱结构无效的如果没有列在左边或者如果结果集没有元数据。

错误

例子
MYSQL_FIELD *field;

while((field = mysql_fetch_field(result)))
{
    printf("field name %s\n", field->name);
}

27.7.7.18 MySQL直接取_ _ _(场)

MYSQL_FIELD *mysql_fetch_field_direct(MYSQL_RES *result, unsigned int fieldnr)

描述

给定一个场数fieldnr在结果集中的列,返回为列的字段定义mysql_field结构。使用此函数来检索任意列的定义。指定一个值fieldnr在范围从0mysql_num_fields(result)-1

元数据可选的连接,这个函数返回NULLresultset_metadata系统变量设置为。检查结果集的元数据,使用mysql_result_metadata()功能。有关管理结果集元数据转换的详细信息,参见第27.7.23,”C API的可选的结果集元数据

返回值

这个MYSQL_FIELD为指定的柱状结构无效的如果结果集没有元数据。

错误

例子
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *field;

num_fields = mysql_num_fields(result);
for(i = 0; i < num_fields; i++)
{
    field = mysql_fetch_field_direct(result, i);
    printf("Field %u is %s\n", i, field->name);
}

27.7.7.19 mysql_fetch_fields()

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

描述

返回的数组MYSQL_FIELD结构的一个结果集。每个结构一列的结果集提供的字段定义。

元数据可选的连接,这个函数返回NULLresultset_metadata系统变量设置为。检查结果集的元数据,使用mysql_result_metadata()功能。有关管理结果集元数据转换的详细信息,参见第27.7.23,”C API的可选的结果集元数据

返回值

一个数组MYSQL_FIELD所有列的结果集的结构。无效的如果你没有结果集的元数据。

错误

例子
unsigned int num_fields;
unsigned int i;
MYSQL_FIELD *fields;

num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
   printf("Field %u is %s\n", i, fields[i].name);
}

27.7.7.20 mysql_fetch_lengths()

unsigned long *mysql_fetch_lengths(MYSQL_RES *result)

描述

返回当前行的列的长度在一个结果集。如果你打算复制字段的值,这个长度的信息也是很有用的优化,因为你可以避免调用strlen()。此外,如果结果集包含二进制数据,你必须使用此函数来确定数据的大小,因为strlen()返回不正确的结果的任何包含空字符字段。

空柱和柱的长度NULL值为零。如何区分这两种情况下,看到的描述mysql_fetch_row()

返回值

无符号的长整型表示每列的大小的数组(不包括任何终止null字节)。NULL如果发生了一个错误

错误

mysql_fetch_lengths()只适用于当前行的结果集。它返回无效的如果你叫它之前调用mysql_fetch_row()或在检索结果的所有行。

例子
MYSQL_ROW row;
unsigned long *lengths;
unsigned int num_fields;
unsigned int i;

row = mysql_fetch_row(result);
if (row)
{
    num_fields = mysql_num_fields(result);
    lengths = mysql_fetch_lengths(result);
    for(i = 0; i < num_fields; i++)
    {
         printf("Column %u is %lu bytes in length.\n",
                i, lengths[i]);
    }
}

27.7.7.21 mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

描述

检索结果集中的下一行。当使用后mysql_store_result()mysql_fetch_row()退货无效的当没有更多的行检索。当使用后mysql_use_result()mysql_fetch_row()退货无效的当没有更多的行检索或如果发生错误。

行中的值的数目是由mysql_num_fields(result)。如果拥有从调用返回值mysql_fetch_row()的值,指针访问行[零]row[mysql_num_fields(result)-1]无效的列中的值,以指示NULL指针

行中的字段值的长度可以通过调用mysql_fetch_lengths()。空字段和字段包含无效的都长0;你可以区分这些通过检查的字段值的指针。如果指针是NULL,场无效的;否则,该字段为空

返回值

MYSQL_ROW为下一步的行结构无效的如果没有更多的行检索或如果发生错误。

错误

错误不重之间的调用mysql_fetch_row()

例子
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
   {
       printf("[%.*s] ", (int) lengths[i],
              row[i] ? row[i] : "NULL");
   }
   printf("\n");
}

27.7.7.22 MySQL _场_ count()

unsigned int mysql_field_count(MYSQL *mysql)

描述

返回在连接最新查询的列数。

这一功能的正常使用时mysql_store_result()返回无效的(因此你没有结果集指针)。在这种情况下,你可以打电话mysql_field_count()如果您发现有错误,请尽管发表评论!mysql_store_result()要产生一个空的结果。这使客户端程序不知道查询是否是采取适当的行动SELECT(或SELECT一样的)声明。下面的例子说明了如何可以做到这。

看到第27.7.25.1,“为什么mysql_store_result()有时返回后mysql_query()返回成功”

返回值

一个无符号整数表示结果的列数集。

错误

例子
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;

if (mysql_query(&mysql,query_string))
{
    // error
}
else // query succeeded, process any data returned by it
{
    result = mysql_store_result(&mysql);
    if (result)  // there are rows
    {
        num_fields = mysql_num_fields(result);
        // retrieve rows, then call mysql_free_result(result)
    }
    else  // mysql_store_result() returned nothing; should it have?
    {
        if(mysql_field_count(&mysql) == 0)
        {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&mysql);
        }
        else // mysql_store_result() should have returned data
        {
            fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
        }
    }
}

另一种方法是更换mysql_field_count(&mysql)电话mysql_errno(&mysql)。在这种情况下,你是直接从检查错误mysql_store_result()而不是根据价值mysql_field_count()是否声明了SELECT

27.7.7.23 MySQL _场_ seek()

MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES *result, MYSQL_FIELD_OFFSET offset)

描述

设置为给定的字段偏移量的光标。下一个电话mysql_fetch_field()检索与补偿相关的列的字段定义。

寻找到一行的开头,通过offset值为零

返回值

这场光标的前一个值

错误

27.7.7.24 MySQL _告诉_(场)

MYSQL_FIELD_OFFSET mysql_field_tell(MYSQL_RES *result)

描述

返回用于近场光标的位置mysql_fetch_field()。这个值可以被用来作为一个参数mysql_field_seek()

返回值

田间的游标的当前偏移。

错误

27.7.7.25 mysql_free_result()

void mysql_free_result(MYSQL_RES *result)

描述

释放分配给一个结果集的存储mysql_store_result()mysql_use_result()mysql_list_dbs(),等等。当你做一个结果集,你必须释放内存使用要求mysql_free_result()

不要试图访问一个结果集后释放。

返回值

错误

27.7.7.26 mysql_get_character_set_info()

void mysql_get_character_set_info(MYSQL *mysql, MY_CHARSET_INFO *cs)

描述

此功能提供了默认的客户端字符集信息。默认的字符集可能会改变的mysql_set_character_set()功能

例子

这个例子表明,在现有的领域MY_CHARSET_INFO结构:

if (!mysql_set_character_set(&mysql, "utf8")){    MY_CHARSET_INFO cs;    mysql_get_character_set_info(&mysql, &cs);    printf("character set information:\n");    printf("character set+collation number: %d\n", cs.number);    printf("character set name: %s\n", cs.name);    printf("collation name: %s\n", cs.csname);    printf("comment: %s\n", cs.comment);    printf("directory: %s\n", cs.dir);    printf("multi byte character min. length: %d\n", cs.mbminlen);    printf("multi byte character max. length: %d\n", cs.mbmaxlen);}

27.7.7.27 MySQL客户端_ _ _ get info()

const char *mysql_get_client_info(void)

描述

返回一个字符串,表示MySQL客户端库版本;例如,"8.0.14"

功能价值是提供客户端库MySQL或连接器/ C版。有关更多信息,参见第27.7.4.5,“C API的服务器和客户端库的版本”

返回值

一个字符串,表示MySQL客户端库版本。

错误

27.7.7.28 MySQL客户端版本_ _ _ get()

unsigned long mysql_get_client_version(void)

描述

返回一个表示MySQL客户端库版本的整数。值的格式XYYZZ哪里X是专业版YY是释放水平(或次要版本),和ZZ在释放水平的子版:

major_version*10000 + release_level*100 + sub_version

例如,"8.0.14"返回八万零一十四

功能价值是提供客户端库MySQL或连接器/ C版。有关更多信息,参见第27.7.4.5,“C API的服务器和客户端库的版本”

返回值

一个表示MySQL客户端库版本的整数。

错误

27.7.7.29 MySQL主机信息_ _ _ get()

const char *mysql_get_host_info(MYSQL *mysql)

描述

返回一个描述使用中的连接的类型的字符串,其中包括服务器主机名。

返回值

一个代表服务器主机名称和连接字符串类型。

错误

27.7.7.30 _ _ MySQL选项(get)

int mysql_get_option(MYSQL *mysql, enum mysql_option option, const void *arg)

描述

返回一个选项可设置使用当前值mysql_options()。价值应被视为只读

这个option的说法是,你想要它的价值选择。这个精氨酸参数是一个指针指向的变量存储选项的值。arg必须是一个指针指向适当的变量的类型选项争论。下表显示了使用每个变量的类型option价值

arg类型适用option价值观
unsigned intMYSQL_OPT_CONNECT_TIMEOUTmysql_opt_protocolMYSQL_OPT_READ_TIMEOUT我的意思是,你知道吗?MYSQL_OPT_SSL_FIPS_MODEmysql_opt_ssl_modeMYSQL_OPT_WRITE_TIMEOUT
unsigned longMYSQL_OPT_MAX_ALLOWED_PACKETmysql_opt_net_buffer_length
boolMYSQL_ENABLE_CLEARTEXT_PLUGINmysql_opt_can_handle_expired_passwordsMYSQL_OPT_GET_SERVER_PUBLIC_KEYmysql_opt_local_infileMYSQL_OPT_OPTIONAL_RESULTSET_METADATAmysql_opt_reconnectMYSQL_REPORT_DATA_TRUNCATION
const char *MYSQL_DEFAULT_AUTH选择MySQL _ _绑定MYSQL_OPT_SSL_CAmysql_opt_ssl_capathMYSQL_OPT_SSL_CERTmysql _退出_ SSL _密码MYSQL_OPT_SSL_CRLmysql_opt_ssl_crlpathMYSQL_OPT_SSL_KEYMySQL的优化_ _ TLS _版MYSQL_PLUGIN_DIRmysql_read_default_fileMYSQL_READ_DEFAULT_GROUPMySQL服务器的公共密钥_ _ _MYSQL_SET_CHARSET_DIRmysql_set_charset_nameMYSQL_SHARED_MEMORY_BASE_NAME
争论没有用MYSQL_OPT_COMPRESS
无法查询(返回错误)MYSQL_INIT_COMMANDmysql_opt_connect_attr_deleteMYSQL_OPT_CONNECT_ATTR_RESETmysql_opt_named_pipe
返回值

零成功。非零如果有错误发生;出现这种情况option不可质疑的价值观

例子

下面的调用测试MYSQL_OPT_RECONNECT选项在调用返回后成功的价值重新连接是真的还是假的指示是否启用自动重连。

bool reconnect;

if (mysql_get_option(mysql, MYSQL_OPT_RECONNECT, &reconnect))
  fprintf(stderr, "mysql_get_options() failed\n");

27.7.7.31 mysql_get_proto_info()

unsigned int mysql_get_proto_info(MYSQL *mysql)

描述

返回当前连接使用的协议版本。

返回值

一个无符号整数表示由当前连接使用的协议版本。

错误

27.7.7.32 mysql_get_server_info()

const char *mysql_get_server_info(MYSQL *mysql)

描述

返回一个字符串,表示MySQL服务器版本;例如,"8.0.14"

返回值

一个字符串表示的MySQL服务器版本。

错误

27.7.7.33 MySQL服务器版本_ _ _ get()

unsigned long mysql_get_server_version(MYSQL *mysql)

描述

返回一个表示MySQL服务器版本的整数。值的格式XYYZZ哪里X是专业版YY是释放水平(或次要版本),和ZZ在释放水平的子版:

major_version*10000 + release_level*100 + sub_version

例如,"8.0.14"返回八万零一十四

这一功能的客户端程序,可用于确定是否存在一些特定版本的服务器性能。

返回值

一个表示MySQL服务器版本的整数。

错误

27.7.7.34 MySQL _ get _ _ cipher(SSL)

const char *mysql_get_ssl_cipher(MYSQL *mysql)

描述

mysql_get_ssl_cipher()返回用于指定连接到服务器的加密密码。MySQL是返回的连接处理mysql_init()

返回值

一个字符串命名连接用的密码,或NULL如果连接没有加密

27.7.7.35 mysql_hex_string()

unsigned long mysql_hex_string(char *to, const char *from, unsigned long length)

描述

这个函数创建使用SQL语句中的合法的SQL字符串。看到9.1.1节,“String Literals”

在字符串from论点是十六进制编码格式,每个字符编码为两个十六进制数字。结果是放在的说法,随后终止null字节。

字符串所指向的from必须是长度字节。你必须分配to缓冲区是至少长×2 1字节。什么时候mysql_hex_string()Returns,the contents of是一个空结束的字符串。返回值是编码的字符串的长度,不包括结束符null字节。

返回值可以被放置到使用SQL语句X'value'0xvalue格式然而,返回值不包括“X”…0x。调用方必须提供所需的任何人。

例子
char query[1000],*end;

end = strmov(query,"INSERT INTO test_table values(");
end = strmov(end,"X'");
end += mysql_hex_string(end,"What is this",12);
end = strmov(end,"',X'");
end += mysql_hex_string(end,"binary data: \0\r\n",16);
end = strmov(end,"')");

if (mysql_real_query(&mysql,query,(unsigned int) (end - query)))
{
   fprintf(stderr, "Failed to insert row, Error: %s\n",
           mysql_error(&mysql));
}

这个strmov()在本例中使用的功能包括在libmysqlclient图书馆工作strcpy()但是,返回一个指向空结束的第一个参数。

返回值

编码的字符串的长度,放入to,不包括终止空字符

错误

27.7.7.36 MySQL _(信息)

const char *mysql_info(MYSQL *mysql)

描述

检索提供关于最近执行的语句的信息字符串,但只有这里列出的报表。其他报表,mysql_info()退货无效的。该字符串的格式取决于声明的类型,如下所述。数字只是说明;字符串包含值适当的语句。

  • INSERT INTO ... SELECT ...

    字符串格式:Records: 100 Duplicates: 0 Warnings: 0

  • INSERT INTO ... VALUES (...),(...),(...)...

    字符串格式:Records: 3 Duplicates: 0 Warnings: 0

  • LOAD DATA INFILE ...

    字符串格式:Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

  • ALTER TABLE

    字符串格式:Records: 3 Duplicates: 0 Warnings: 0

  • UPDATE

    字符串格式:Rows matched: 40 Changed: 40 Warnings: 0

mysql_info()返回一个非—无效的价值INSERT ... VALUES只为表的多行的形式(即,如果指定多个值列表)。

返回值

一个代表最近执行的语句的额外信息的字符串。NULL如果没有可用的信息的声明。

错误

27.7.7.37 mysql_init()

MYSQL *mysql_init(MYSQL *mysql)

描述

分配和初始化MYSQL适合对象mysql_real_connect()。如果MySQL是一个NULL指针的功能分配、初始化并返回一个新的对象。否则,对象被初始化的对象的地址返回。如果mysql_init()分配一个新的对象,它被释放时mysql_close()被称为关闭连接

在nonmultithreaded环境,mysql_init()调用mysql_library_init()自动是必要的。然而,mysql_library_init()在多线程环境中不是线程安全的,因此无论是mysql_init()。在调用mysql_init(),打打电话mysql_library_init()产卵前的任何线程,或者使用一个互斥体保护mysql_library_init()呼叫。这应该是任何其他的客户端库调用之前完成。

返回值

一个初始化的MYSQL*处理程序无效的如果没有足够的内存来分配一个新的对象。

错误

在内存不足的情况,NULL返回

27.7.7.38 mysql_insert_id()

my_ulonglong mysql_insert_id(MYSQL *mysql)

描述

返回一个值的产生AUTO_INCREMENT由以前的列INSERTUPDATE声明。使用这一功能,当你完成一个INSERT声明为一个表,包含一个汽车场,或使用INSERTUPDATE设置列值LAST_INSERT_ID(expr)

返回值mysql_insert_id()总是零,除非明确更新以下条件:

返回值mysql_insert_id()可简化为以下序列:

  1. 如果有一个AUTO_INCREMENT柱,和一个自动生成的值被成功克隆,返回第一个值。

  2. 如果LAST_INSERT_ID(expr)在一份声明中发生,返回expr,即使有一个汽车在受影响的表列

  3. 返回值取决于使用的声明。当所谓的后INSERT声明:

    • 如果有一个AUTO_INCREMENT表中的列,该列有成功插入到表的一些明确的值,返回的值最后明确。

    当所谓的后INSERT ... ON DUPLICATE KEY UPDATE声明:

    • 如果有一个AUTO_INCREMENT表中列有一些明确的成功插入值或更新的值,返回的插入或更新值的最后。

mysql_insert_id()退货如果前面的语句不使用AUTO_INCREMENT价值。如果你需要保存的值后,一定要打电话mysql_insert_id()生成价值声明后立即

价值mysql_insert_id()只有在当前客户端连接发布报表的影响。它不是由其他客户出具报表的影响。

这个LAST_INSERT_ID()SQL函数将包含第一个自动生成的值,成功插入。LAST_INSERT_ID()不复位陈述之间因为这个函数的值保存在服务器。另一个区别mysql_insert_id()是的,LAST_INSERT_ID()不更新如果您设置汽车列一个特定种类的价值。看到12.14节,“信息功能”

mysql_insert_id()退货下面的一个CALL语句的存储过程生成汽车因为在这种情况下mysql_insert_id()适用于CALL而不是语句在程序。在程序中,你可以使用LAST_INSERT_ID()在SQL层面获得汽车价值

之间的差异的原因LAST_INSERT_ID()mysql_insert_id()是的,LAST_INSERT_ID()是易于使用的脚本,mysql_insert_id()试图提供对发生什么更准确的信息汽车专栏

笔记

采用客户机/服务器协议好的分组信息保存如用于会话状态跟踪。当用户阅读的好包,知道是否有一个会话状态的变化,这重置价值等最后插入ID和受影响的行数。这种变化的原因mysql_insert_id()返回命令执行后0包括但不限于com_pingCOM_REFRESH,和com_init_db

返回值

在前面的讨论

错误
  • ER_AUTO_INCREMENT_CONFLICT

    用户指定的AUTO_INCREMENT在多元价值INSERT语句之间的电流范围之内汽车价值和受影响的行的当前值和数量的总和。

27.7.7.39 MySQL _杀(的)

int mysql_kill(MYSQL *mysql, unsigned long pid)

描述
笔记

mysql_kill()是过时的、将在未来版本的MySQL移除。相反,使用mysql_query()执行一个KILL声明

要求服务器杀死指定的线程pid

此功能已过时。使用mysql_query()发出一个SQLKILL语句

mysql_kill()不能处理值大于32位,但要警惕杀错线程返回一个错误,在这种情况下:

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.40 MySQL _图书馆_ end()

void mysql_library_end(void)

描述

这个函数完成MySQL客户端库。把它当你使用完库(例如,从服务器断开连接后)。

笔记

在应用程序是使用图书馆避免内存泄漏(例如,关闭连接到服务器后),一定要打电话mysql_library_end()明确地.这使得内存管理进行清理和释放资源库使用的。

使用的信息,参见第27.7.6,“C API函数概述”,和第27.7.7.41,“mysql_library_init()”

27.7.7.41 mysql_library_init()

int mysql_library_init(int argc, char **argv, char **groups)

描述

调用这个函数来初始化MySQL客户端库在你调用任何其他MySQL函数。

笔记

在应用程序是使用图书馆避免内存泄漏(例如,关闭连接到服务器后),一定要打电话mysql_library_end()明确地.这使得内存管理进行清理和释放资源库使用的。看到第27.7.7.40,“mysql_library_end()”

在nonmultithreaded环境,调用mysql_library_init()可以省略,因为mysql_init()将自动调用它时。然而,mysql_library_init()在多线程环境中不是线程安全的,因此无论是mysql_init(),这要求mysql_library_init()。你必须调用mysql_library_init()产卵前或其他任何线程,使用互斥锁保护的呼唤,你是否调用mysql_library_init()或间接通过mysql_init()。任何其他的客户端库调用之前做这个。

这个argcargv,和groups争论是无用的。在旧的版本,它们被用来连接的嵌入式服务器应用程序,它不再支持。电话现在应该写成mysql_library_init(0, NULL, NULL)

#include <mysql.h>#include <stdlib.h>int main(void) {  if (mysql_library_init(0, NULL, NULL)) {    fprintf(stderr, "could not initialize MySQL client library\n");    exit(1);  }  /* Use any MySQL API functions here */  mysql_library_end();  return EXIT_SUCCESS;}
返回值

零成功。非零,如果发生了一个错误。

27.7.7.42 mysql_list_dbs()

MYSQL_RES *mysql_list_dbs(MYSQL *mysql, const char *wild)

描述

返回一个结果集包含在服务器,简单的正则表达式匹配指定的数据库名称wild参数.野生的可以包含通配符%_,或可能是一个NULL匹配所有数据库指针。打电话mysql_list_dbs()类似于执行查询显示数据库[喜欢wild]

你必须自由的结果集mysql_free_result()

返回值

MYSQL_RES为成功的结果集无效的如果发生了一个错误

错误

27.7.7.43 mysql_list_fields()

MYSQL_RES *mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)

描述
笔记

mysql_list_fields()是过时的、将在未来版本的MySQL移除。相反,使用mysql_query()执行一个SHOW COLUMNS声明

返回一个空结果集的元数据提供有关栏目信息在给定的表相匹配的简单的正则表达式指定的wild参数.野生的可以包含通配符%_,或可能是一个NULL匹配所有字段的指针。打电话mysql_list_fields()类似于执行查询显示列tbl_name喜欢wild]

最好使用SHOW COLUMNS FROM tbl_name而不是mysql_list_fields()

你必须自由的结果集mysql_free_result()

返回值

MYSQL_RES为成功的结果集无效的如果发生了一个错误

错误
例子
int i;
MYSQL_RES *tbl_cols = mysql_list_fields(mysql, "mytbl", "f%");

unsigned int field_cnt = mysql_num_fields(tbl_cols);
printf("Number of columns: %d\n", field_cnt);

for (i=0; i < field_cnt; ++i)
{
  /* col describes i-th column of the table */
  MYSQL_FIELD *col = mysql_fetch_field_direct(tbl_cols, i);
  printf ("Column %d: %s\n", i, col->name);
}
mysql_free_result(tbl_cols);

27.7.7.44 mysql_list_processes()

MYSQL_RES *mysql_list_processes(MYSQL *mysql)

描述
笔记

mysql_list_processes()是过时的、将在未来版本的MySQL移除。相反,使用mysql_query()执行一个SHOW PROCESSLIST声明

返回一个结果集,描述了当前服务器的线程。这是一种信息报道mysqladmin processlistSHOW PROCESSLIST查询

你必须自由的结果集mysql_free_result()

返回值

MYSQL_RES为成功的结果集无效的如果发生了一个错误

错误

27.7.7.45 mysql_list_tables()

MYSQL_RES *mysql_list_tables(MYSQL *mysql, const char *wild)

描述

返回一个结果集包含在当前数据库的简单的正则表达式匹配指定的表名wild参数.野生的可以包含通配符%_,或可能是一个NULL匹配所有表的指针。打电话mysql_list_tables()类似于执行查询显示表[喜欢wild]

你必须自由的结果集mysql_free_result()

返回值

MYSQL_RES为成功的结果集无效的如果发生了一个错误

错误

27.7.7.46 mysql_more_results()

bool mysql_more_results(MYSQL *mysql)

描述

使用此功能,当你执行多个语句指定为单个语句的字符串,或当你执行CALL报表,可以返回多个结果集。

mysql_more_results()如果更多的结果,从目前执行的语句的真实存在,在这种情况下,应用程序必须调用mysql_next_result()取结果

返回值

TRUE(1)如果存在更多的结果。错误的(0)如果没有结果的存在。

在大多数情况下,你可以打电话mysql_next_result()相反,测试是否存在更多的结果如果是这样开始检索。

看到第27.7.19,“C API多语句执行的支持”,和第27.7.7.47,“mysql_next_result()”

错误

27.7.7.47 mysql_next_result()

int mysql_next_result(MYSQL *mysql)

描述

使用此功能,当你执行多个语句指定为单个语句的字符串,或当您使用CALL语句执行存储过程,可以返回多个结果集。

mysql_next_result()读取下一个语句的结果并返回一个状态指示是否存在更多的结果。如果mysql_next_result()返回一个错误,没有结果。

在每次调用mysql_next_result(),你必须调用mysql_free_result()对于目前的声明,如果它是一个语句,返回一个结果集(而不仅仅是一个结果状态)。

在调用mysql_next_result()连接的状态,如果你叫了mysql_real_query()mysql_query()在接下来的声明。这意味着你可以打电话mysql_store_result()mysql_warning_count()mysql_affected_rows()第四,”

如果你的程序使用CALL语句执行存储过程的client_multi_results国旗必须启用。这是因为每个CALL返回一个结果显示呼叫状态,除了可能在程序执行的语句返回的结果集。因为CALL可以返回多个结果,使用循环调用它们的过程mysql_next_result()以确定是否有更多的结果。

CLIENT_MULTI_RESULTS可以使你打电话时mysql_real_connect(),直接通过client_multi_results标志本身,或隐式地通过CLIENT_MULTI_STATEMENTS(这也使client_multi_resultsCLIENT_MULTI_RESULTS默认情况下启用

它也可以检测是否有更多的结果,通过调用mysql_more_results()。然而,这个函数不改变连接状态,所以如果它返回true,你仍然必须调用mysql_next_result()前进到下一个结果

为例,说明如何使用mysql_next_result(),看到第27.7.19,“C API多语句执行的支持”

返回值
返回值描述
成功的和有更多的结果
- 1成功并没有更多的结果
&#62; 0发生了一个错误
错误

27.7.7.48 mysql num字段(_ _)

unsigned int mysql_num_fields(MYSQL_RES *result)

通过MYSQL*的说法相反,使用unsigned int mysql_field_count(mysql * MySQL)

描述

返回一个结果集的列数。

你可以从一个指针指向一个结果集或一个连接处理得到的列数。你将使用的连接句柄如果mysql_store_result()mysql_use_result()返回无效的(因此你没有结果集指针)。在这种情况下,你可以打电话mysql_field_count()如果您发现有错误,请尽管发表评论!mysql_store_result()要产生一个空的结果。这使客户端程序不知道查询是否是采取适当的行动SELECT(或SELECT一样的)声明。下面的例子说明了如何可以做到这。

看到第27.7.25.1,“为什么mysql_store_result()有时返回后mysql_query()返回成功”

返回值

一个无符号整数表示结果的列数集。

错误

例子
MYSQL_RES *result;
unsigned int num_fields;
unsigned int num_rows;

if (mysql_query(&mysql,query_string))
{
    // error
}
else // query succeeded, process any data returned by it
{
    result = mysql_store_result(&mysql);
    if (result)  // there are rows
    {
        num_fields = mysql_num_fields(result);
        // retrieve rows, then call mysql_free_result(result)
    }
    else  // mysql_store_result() returned nothing; should it have?
    {
        if (mysql_errno(&mysql))
        {
           fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
        }
        else if (mysql_field_count(&mysql) == 0)
        {
            // query does not return data
            // (it was not a SELECT)
            num_rows = mysql_affected_rows(&mysql);
        }
    }
}

另一个(如果你知道你的查询应该返回一个结果集)是取代mysql_errno(&mysql)一个检查是否呼叫mysql_field_count(&mysql)返回0。这种情况只有当事情错了。

27.7.7.49 mysql_num_rows()

my_ulonglong mysql_num_rows(MYSQL_RES *result)

描述

返回结果集的行数

使用mysql_num_rows()取决于你是否使用mysql_store_result()mysql_use_result()返回的结果集。如果你使用mysql_store_result()mysql_num_rows()可以立即调用。如果你使用mysql_use_result()mysql_num_rows()不到结果集中的所有行被检索正确的价值回归。

mysql_num_rows()目的是为使用语句返回结果集,如SELECT。对于这样的语句INSERTUPDATE,或DELETE,受影响的行数可以获得mysql_affected_rows()

返回值

在结果集的行数

错误

7.7.50 Mysql Options()

int mysql_options(MYSQL *mysql, enum mysql_option option, const void *arg)

描述

可用于设置额外的连接选项和一个连接性能的影响。这个函数可以被多次设置几个选项。检索选项值,使用mysql_get_option()

呼叫mysql_options()之后mysql_init()和之前mysql_connect()mysql_real_connect()

这个option一个说法是你想设置的选项;精氨酸参数是期权的价值。如果期权是一个整数,指定整数的值作为一个指针arg争论

信息,如SSL证书和密钥文件选项用于如连接可建立加密连接,但不执行任何要求得到的连接是加密的。需要加密连接,使用技术进行了第27.7.18,“C API加密连接支持”

下面的列表描述了可能的选项,他们的作用,以及如何argis used for each选项。这表明选项描述为精氨酸闲置,其价值是无关的;是传统的通过0。

  • MYSQL_DEFAULT_AUTH(参数类型:char *

    使用身份验证插件的名称。

  • MYSQL_ENABLE_CLEARTEXT_PLUGIN(参数类型:布尔*

    使mysql_clear_password明文认证插件。看到第6.5.1.4,“客户端明文认证”

  • MYSQL_INIT_COMMAND(参数类型:char *

    SQL语句执行连接到MySQL服务器的时候。自动重新执行如果重联发生。

  • MYSQL_OPT_BIND(参数:char *

    从该网络接口连接到服务器。这是用在客户端主机有多个网络接口。参数是一个主机名或IP地址(指定为字符串)。

  • MYSQL_OPT_CAN_HANDLE_EXPIRED_PASSWORDS(参数类型:布尔*

    指示客户端是否可以处理过期的密码。看到第6.3.9条,“服务器处理过期的密码”

  • MYSQL_OPT_COMPRESS(论点:不使用)

    使用压缩的客户端/服务器协议。

  • MYSQL_OPT_CONNECT_ATTR_DELETE(参数类型:char *

    给出了关键的名字,此选项删除键/值从连接电流集对属性传递给服务器在连接时间。参数是一个指向一个空结束的字符串命名的关键。与现有的密钥的密钥名是大小写敏感的比较。

    See also the描述for theMYSQL_OPT_CONNECT_ATTR_RESET选项,以及用于描述mysql_opt_connect_attr_add在描述选项mysql_options4()功能。功能描述还包括一个使用的例子。

    性能模式暴露出连接属性的session_connect_attrssession_account_connect_attrs表看到第25.11.9,绩效模式连接属性表”

  • MYSQL_OPT_CONNECT_ATTR_RESET(参数不使用)

    这个选项复位(清除)连接的当前设置的属性传递给服务器在连接时间。

    See also the描述for theMYSQL_OPT_CONNECT_ATTR_DELETE选项,以及用于描述mysql_opt_connect_attr_add在描述选项mysql_options4()功能。功能描述还包括一个使用的例子。

    性能模式暴露出连接属性的session_connect_attrssession_account_connect_attrs表看到第25.11.9,绩效模式连接属性表”

  • MYSQL_OPT_CONNECT_TIMEOUT(参数类型:unsigned int *

    连接超时秒数

  • MYSQL_OPT_GET_SERVER_PUBLIC_KEY(参数类型:布尔*

    允许客户端请求来自服务器的RSA密钥对的公钥密码交换所需的基础。此选项适用于客户端验证的caching_sha2_password身份验证插件。这个插件,服务器不发送公钥除非要求。这个选项是账户不验证插件忽略。也正是基于RSA密码如果交换不使用的忽视,如当客户端连接到服务器使用安全连接。

    如果MYSQL_SERVER_PUBLIC_KEY给出指定有效的公钥文件,它将优先于mysql_opt_get_server_public_key

    的信息caching_sha2_password插件,看第6.5.1.3,“缓存SHA-2认证”

  • MYSQL_OPT_LOCAL_INFILE(参数类型:可选指针无符号整型

    这个选项会影响客户端LOCAL能力LOAD DATA操作。默认,当地能力是通过默认编译为MySQL客户端库确定(见第13.2.7、“LOAD DATA INFILE语法”)。为了控制这种能力的显式调用mysql_options()设置mysql_opt_local_infile选项:

    • LOCAL被禁用,如果指针指向一个无符号整型有10个值

    • LOCAL如果没有指针,如果指针指向的功能无符号整型有一个非零的值

    一个成功的使用LOCAL由客户端负载运行也需要服务器允许它。

  • MYSQL_OPT_MAX_ALLOWED_PACKET(参数:无符号长*

    这个选项设置max_allowed_packet系统变量。if theMySQL争论是非NULL电话会议系统,设置变量值为会话。如果MySQLNULL,呼叫设置全局系统变量的值。

  • MYSQL_OPT_NAMED_PIPE(论点:不使用)

    使用命名管道连接到的服务器上,如果服务器允许命名管道连接。

  • MYSQL_OPT_NET_BUFFER_LENGTH(参数:无符号长*

    这个选项设置net_buffer_length系统变量。if theMySQL争论是非NULL电话会议系统,设置变量值为会话。如果MySQLNULL,呼叫设置全局系统变量的值。

  • MYSQL_OPT_OPTIONAL_RESULTSET_METADATA(参数类型:布尔*

    这个标志使结果集元数据可选。它是一种替代的方式设置CLIENT_OPTIONAL_RESULTSET_METADATA对于连接标志mysql_real_connect()功能。有关管理结果集元数据转换的详细信息,参见第27.7.23,”C API的可选的结果集元数据

  • MYSQL_OPT_PROTOCOL(参数类型:unsigned int *

    使用两种类型的协议。specify枚举值的一部mysql_protocol_type定义MySQL的

  • MYSQL_OPT_READ_TIMEOUT(参数类型:unsigned int *

    每一个试图从服务器读取秒超时。如果有必要有重试,所以总有超时值是期权价值的三倍。你可以让一个失去联系可能比TCP / IP更早检测到设定值Close_Wait_Timeoutvalue of 10分钟。

  • MYSQL_OPT_RECONNECT(参数类型:布尔*

    启用或禁用自动重新连接到服务器,如果连接被发现了。重新连接默认是关闭的;这个选项提供了一种集联行为明确。看到第27.7.24,“C API自动重联控制”

  • MYSQL_OPT_RETRY_COUNT(参数类型:unsigned int *

    重试计数I/O相关的是连接到服务器或连通而中断的系统调用。默认值是1(1次重试如果初始呼叫中断2次总)。

  • MYSQL_OPT_SSL_CA(参数类型:char *

    该证书颁发机构的证书文件的路径名(CA)。这个选项,如果使用,必须指定的服务器使用相同的证书。

  • MYSQL_OPT_SSL_CAPATH(参数类型:char *

    包含受信任的SSL证书的CA文件的目录的路径名。

  • MYSQL_OPT_SSL_CERT(参数类型:char *

    用户的公钥证书的文件的路径名。

  • MYSQL_OPT_SSL_CIPHER(参数类型:char *

    允许SSL加密的密码列表。

  • MYSQL_OPT_SSL_CRL(参数类型:char *

    含证书吊销列表的文件的路径名。

  • MYSQL_OPT_SSL_CRLPATH(参数类型:char *

    含证书吊销列表包含文件的目录的路径名。

  • MYSQL_OPT_SSL_FIPS_MODE(参数类型:unsigned int *

    控制是否启用FIPS模式在客户端。这个MYSQL_OPT_SSL_FIPS_MODE2 . Option Differs from otherMySQL _选择_ SSL _xxx选项,它不是用来建立加密连接,而是影响加密操作是允许的。看到6.6节,“FIPS支持”

    允许的选项值SSL_FIPS_MODE_OFF【医学】-1 -1 -1 -1 -1 -1 -1 -1 -1,和SSL_FIPS_MODE_STRICT

    笔记

    如果OpenSSL FIPS对象模块是不可用的,唯一被允许的值MYSQL_OPT_SSL_FIPS_MODE【医】-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1。在这种情况下,设置MYSQL_OPT_SSL_FIPS_MODE【医学】-1 -1 -1 -1 -1 -1 -1 -1 -1SSL_FIPS_MODE_STRICT使客户产生在启动警告,在非FIPS模式操作。

  • MYSQL_OPT_SSL_KEY(参数类型:char *

    在路径名客户的私人密钥文件。

  • MYSQL_OPT_SSL_MODE(参数类型:unsigned int *

    安全状态,使用连接到服务器:SSL_MODE_DISABLEDssl_mode_preferredSSL_MODE_REQUIREDssl_mode_verify_caSSL_MODE_VERIFY_IDENTITY。默认值是ssl_mode_preferred。这些模式允许值的mysql_ssl_mode枚举的定义MySQL的。关于安全状态的更多信息,见描述--ssl-mode进入第6.4.2,“加密连接”命令选项

  • MYSQL_OPT_TLS_VERSION(参数类型:char *

    该协议允许客户端通过加密连接。价值是一个逗号分隔的列表包含一个或多个协议名称。可以指定此选项取决于用来编译MySQL的SSL库的协议。详情见第6.4.6,“加密连接协议和密码”

  • MYSQL_OPT_USE_RESULT(论点:不使用)

    这个选项是无用的

  • MYSQL_OPT_WRITE_TIMEOUT(参数类型:unsigned int *

    每个尝试写入服务器的超时秒数。有一个重试,如果必要的话,那么总有超时值是期权价值两倍。

  • MYSQL_PLUGIN_DIR(参数类型:char *

    目录中查找客户端插件。

  • MYSQL_READ_DEFAULT_FILE(参数类型:char *

    阅读选项指定的选项文件而不是从my.cnf

  • MYSQL_READ_DEFAULT_GROUP(参数类型:char *

    从命名组选项my.cnf或指定的文件mysql_read_default_file

  • MYSQL_REPORT_DATA_TRUNCATION(参数类型:布尔*

    启用或禁用数据报告的准备好的语句使用的截断误差error成员MySQL _绑定结构.(默认启用。)

  • MYSQL_SERVER_PUBLIC_KEY(参数类型:char *

    包含由RSA密钥对的密码交换服务器所需的公共密钥的客户端复制的文件的路径名。该文件必须在PEM格式。此选项适用于客户端验证的sha256_passwordcaching_sha2_password身份验证插件。这个选项是账户不认证有一个插件忽略。也正是基于RSA密码如果交换不使用的忽视,如当客户端连接到服务器使用安全连接。

    如果MYSQL_SERVER_PUBLIC_KEY给出指定有效的公钥文件,它将优先于mysql_opt_get_server_public_key

    的信息sha256_passwordcaching_sha2_password插件,看第6.5.1.2,“SHA-256认证”,和第6.5.1.3,“缓存SHA-2认证”

  • MYSQL_SET_CHARSET_DIR(参数类型:char *

    包含集定义文件的目录的路径名的字符。

  • MYSQL_SET_CHARSET_NAME(参数类型:char *

    设置为使用默认字符集的字符的名称。参数可以是MYSQL_AUTODETECT_CHARSET_NAME使字符集可以自动根据操作系统的设置(见10.4节,“连接字符集和Collations”

  • MYSQL_SHARED_MEMORY_BASE_NAME(参数类型:char *

    通信在Windows服务器的共享内存对象的名称,如果服务器支持共享内存连接。指定相同的值--shared-memory-base-name使用选项mysqld你要连接的服务器

这个client集团始终阅读如果你使用mysql_read_default_fileMYSQL_READ_DEFAULT_GROUP

在选项文件指定的组可能包含以下选项。

选项描述
character-sets-dir=dir_name目录中的字符集设置
compress使用压缩的客户端/服务器协议。
connect-timeout=seconds连接超时秒数。在Linux这个超时也用于等待来自服务器的第一个答案。
database=db_name如果没有数据库的连接命令指定连接到这个数据库。
debug调试选项
default-character-set=charset_name使用默认字符集
disable-local-infile禁用LOAD DATA LOCAL INFILE
enable-cleartext-plugin使mysql_clear_passwordClearext authentcation lujer .
host=host_name默认的主机名
init-command=stmt语句执行连接到MySQL服务器的时候。自动重新执行如果重联发生。
interactive-timeout=seconds同指定CLIENT_INTERACTIVEmysql_real_connect()。。。。。。。这第27.7.7.54,mysql connect()_皇家_”
local-infile[={0|1}]如果没有参数或非参数,可以使用LOAD DATA LOCAL否则,禁用
max_allowed_packet=bytes最大尺寸的包,客户端可以读取从服务器。
multi-queries多结果允许来自多个表或存储过程执行多个结果集。
multi-statements使客户能够在一个单一的字符串发送多个语句(分离;字符)
password=password默认密码
pipe使用命名管道连接到一个MySQL服务器在Windows。
port=port_num默认端口号
protocol={TCP|SOCKET|PIPE|MEMORY}协议连接服务器时使用。
return-found-rows告诉mysql_info()还发现行而不是更新行时使用UPDATE
shared-memory-base-name=name使用连接到服务器的共享内存的名字。
socket={file_name|pipe_name}缺省套接字文件
ssl-ca=file_name认证机构文件
ssl-capath=dir_name证书权威目录
ssl-cert=file_name证书文件
ssl-cipher=cipher_list允许SSL加密
ssl-key=file_name密钥文件
timeout=seconds喜欢connect-timeout
user默认用户

timeout已取代连接超时,但timeout还支持向后兼容

为更多的信息关于选项文件mysql程序使用,看第4.2.6、“使用选项文件”

返回值

成功的为零。非零如果你specify an unknown option。

例子

以下mysql_options()调用请求压缩在客户端/服务器协议的使用,因为选项是从[ odbc ]在选择的文件组,并禁用事务自动提交模式:

MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_OPT_COMPRESS,0);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"odbc");
mysql_options(&mysql,MYSQL_INIT_COMMAND,"SET autocommit=0");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

27 . 7.7.51 MysQL Options4()

int mysql_options4(MYSQL *mysql, enum mysql_option option, const void *arg1, const void *arg2)

描述

mysql_options4()类似于mysql_options()但有一个额外的第四个参数,两值可以通过第二参数指定的选项。

下面的列表描述了允许的选项,他们的作用,以及如何arg1arg2使用

  • MYSQL_OPT_CONNECT_ATTR_ADD(参数类型:字符串,字符串

    此选项添加一个属性的键/值对来连接当前设置的属性传递给服务器在连接时间。双方的观点都是以空字符结束的字符串的指针。第一和第二字符串表示的键和值,分别。如果键是空的或已经存在的连接属性的当前设置,出现错误。与现有的密钥的密钥名是大小写敏感的比较。

    关键的名字以下划线开头(_)是保留供内部使用,不应该由应用程序创建的。本公约允许新的属性被引入到MySQL应用属性无碰撞。

    mysql_options4()施加限制64KB对连接属性数据将接受的总大小。打电话,导致这样的限制将超过一CR_INVALID_PARAMETER_NO错误发生。属性大小限制检查也在服务器端发生。详情见第25.11.9,绩效模式连接属性表”,其中还介绍了如何的性能模式暴露出连接属性的session_connect_attrssession_account_connect_attrs

    See also the Desells for theMYSQL_OPT_CONNECT_ATTR_RESETmysql_opt_connect_attr_delete选择in the description of themysql_options()功能

返回值

成功的为零。非零如果你specify an unknown option。

错误
例子

这个例子表明,指定连接属性的调用:

MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_OPT_CONNECT_ATTR_RESET, 0);
mysql_options4(&mysql,MYSQL_OPT_CONNECT_ATTR_ADD, "key1", "value1");
mysql_options4(&mysql,MYSQL_OPT_CONNECT_ATTR_ADD, "key2", "value2");
mysql_options4(&mysql,MYSQL_OPT_CONNECT_ATTR_ADD, "key3", "value3");
mysql_options(&mysql,MYSQL_OPT_CONNECT_ATTR_DELETE, "key1");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
        mysql_error(&mysql));
}

27.7.7.52 mysql_ping()

int mysql_ping(MYSQL *mysql)

描述

检查是否连接到服务器是工作。如果连接了自动重新启用一个尝试重新连接了。如果连接和自动重新连接被禁用,mysql_ping()返回一个错误

自动重新连接默认是禁用的。要启用它,叫mysql_options()mysql_opt_reconnect选项详情见第27.7.7.50,“mysql_options()”

mysql_ping()可以通过客户闲置很长一段时间的使用,检查服务器是否已经关闭了连接,重新连接,如果必要的话。

如果mysql_ping())会导致一个重新连接,没有明确的迹象表明它。确定是否重新连接时,呼叫mysql_thread_id()在打电话之前把原来的连接标识符mysql_ping(),然后调用mysql_thread_id()再次看到标识符是否已经改变。

如果重新连接时,连接的一些特性将被重置。有关这些特性的详细信息,参见第27.7.24,“C API自动重联控制”

返回值

零,如果连接到服务器是活跃的。非零,如果发生了一个错误。一个非零返回不指示MySQL服务器本身是下;连接可能损坏其他原因如网络问题。

错误

27.7.7.53 mysql_query()

int mysql_query(MYSQL *mysql, const char *stmt_str)

描述

执行SQL语句,指出由零终止字符串stmt_str。通常情况下,字符串必须包含一个SQL语句没有结束分号()或\g。如果多个语句执行已启用,字符串可以包含多个语句用分号分隔。看到第27.7.19,“C API多语句执行的支持”

mysql_query()不能用于包含二进制数据报表;你必须使用mysql_real_query()相反。(二进制数据可能包含0性格,这mysql_query()解释为声明字符串结束。)

如果你想知道该语句返回的结果集,你可以使用mysql_field_count()检查此。看到第27.7.7.22,“mysql_field_count()”

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.54 mysql real connect()_ _

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag)

描述

mysql_real_connect()尝试建立一个MySQL数据库引擎运行在连接主办mysql_real_connect()必须成功完成之前,你可以执行任何其他的API函数,需要一个有效的MySQL连接处理器结构

参数指定如下:

  • 对于第一个参数指定了一个现有的地址MYSQL结构。在调用mysql_real_connect(),叫mysql_init()初始化MySQL结构。你可以改变很多连接选项与mysql_options()呼叫。看到第27.7.7.50,“mysql_options()”

  • 价值host可以是一个主机名或IP地址。如果主办NULL或字符串“localhost”,一个本地主机连接假设。对于Windows客户端连接使用一个共享内存连接,如果服务器的共享内存连接启用。否则,使用TCP/IP。对Unix客户端连接使用UNIX socket文件。对于本地连接,你也可以影响使用的连接类型MYSQL_OPT_PROTOCOLmysql_opt_named_pipe选项mysql_options()。连接类型必须由服务器支持。对于一个主办价值"."在Windows中,客户端连接使用命名管道,如果服务器启用命名管道连接。如果未启用命名管道连接,出现错误。

  • 这个user参数包含用户的MySQL login ID.如果用户NULL或空字符串“”,当前用户。在Unix上,这是当前登录名。在Windows的ODBC,当前用户的名称必须明确指定。看到连接器/ ODBC段27章,连接器和API

  • 这个passwd参数包含密码用户。如果passwd无效的,只有在条目user对于有一个空白的用户表(空)密码字段是否匹配。这使数据库管理员,在这样一种方式,用户可以得到不同的权限,这取决于他们是否有指定的密码设置MySQL的权限系统。

    笔记

    不要试图加密密码之前调用mysql_real_connect();密码加密是自动处理的客户端API。

  • 这个user口令参数使用什么字符集被配置为MYSQL目标默认情况下,这是utf8mb4,但可以改变通过调用mysql_options(mysql, MYSQL_SET_CHARSET_NAME, "charset_name")Prior to Conecting .

  • dbis the数据库名称。ifDB是不是NULL设置默认数据库的连接,这个价值。

  • 如果port不是0,价值作为端口号为TCP/IP连接。请注意,主办参数确定的连接类型

  • 如果unix_socket是不是无效的,字符串指定插座或命名管道使用。请注意,host参数确定的连接类型

  • 价值client_flag通常是零,但可以设置以下标志位的组合使某些功能:

    • CAN_HANDLE_EXPIRED_PASSWORDS:客户端可以处理过期的密码。有关更多信息,参见第6.3.9条,“服务器处理过期的密码”

    • CLIENT_COMPRESS:在客户机/服务器协议使用压缩。

    • CLIENT_FOUND_ROWS:返回已发现(匹配)的行,而不是改变了的行数。

    • CLIENT_IGNORE_SIGPIPE:阻止客户端库安装sigpipe信号处理程序。这可以用来避免与处理器的应用程序已经安装的冲突。

    • CLIENT_IGNORE_SPACE空间:允许在函数名后。所有函数名可以保留字。

    • CLIENT_INTERACTIVE许可证:interactive_timeout秒(而不是wait_timeout秒)在关闭连接之前。客户端的会话wait_timeout变量设置为会话的值interactive_timeout变量

    • CLIENT_LOCAL_FILES使:LOAD DATA LOCAL处理

    • CLIENT_MULTI_RESULTS:告诉服务器,客户端可以处理多个结果集从多个语句或存储过程的执行。这个标志是自动启用如果多客户端_ _声明启用。可以在本表后查看更多信息关于这个标志。

    • CLIENT_MULTI_STATEMENTS:告诉服务器,客户端可以在一个字符串中发送多个语句(分离字符)。如果未设置此标志,多条语句执行禁用。可以在本表后查看更多信息关于这个标志。

    • CLIENT_NO_SCHEMA不允许db_name.tbl_name.col_name语法。这是ODBC。解析器会产生一个错误,如果你使用的语法,这在某些ODBC程序捕捉虫子是有用的。

    • CLIENT_ODBCunused:。。。。。。。

    • CLIENT_OPTIONAL_RESULTSET_METADATA:这个标志使结果集元数据可选。元数据转移抑制可以提高性能,特别是执行多个查询返回的几排次。有关管理结果集元数据转换的详细信息,参见第27.7.23,”C API的可选的结果集元数据

    • CLIENT_SSL:使用SSL(加密协议)。不要设置在应用程序这个选项;它是建立在客户端库内部。相反,使用mysql_options()mysql_ssl_set()在调用mysql_real_connect()

    • CLIENT_REMEMBER_OPTIONS记得指定调用选项mysql_options()。没有这个选项,如果mysql_real_connect()不,你必须重复mysql_options()打电话前要重新连接。这个选项的mysql_options()电话不需要重复

如果你的程序使用CALL语句执行存储过程的client_multi_results国旗必须启用。这是因为每个CALL返回一个结果显示呼叫状态,除了可能在程序执行的语句返回的结果集。因为CALL可以返回多个结果,使用循环调用它们的过程mysql_next_result()以确定是否有更多的结果。

CLIENT_MULTI_RESULTS可以使你打电话时mysql_real_connect(),直接通过client_multi_results标志本身,或隐式地通过CLIENT_MULTI_STATEMENTS(这也使client_multi_resultsCLIENT_MULTI_RESULTS默认情况下启用

如果你使CLIENT_MULTI_STATEMENTSclient_multi_results,为每一个电话,结果的过程mysql_query()mysql_real_query()利用循环调用mysql_next_result()以确定是否有更多的结果。例如,看第27.7.19,“C API多语句执行的支持”

对于某些参数,它可能是有价值的从选项文件而不是在一个显式值mysql_real_connect()呼叫。要做到这一点,叫mysql_options()mysql_read_default_fileMYSQL_READ_DEFAULT_GROUP选项前打电话mysql_real_connect()。然后,在mysql_real_connect()电话,指定没有价值每个参数可以从选项文件中读取值:

  • host指定一个值,无效的或空字符串(""

  • user指定一个值,无效的或空字符串

  • passwd指定一个值,无效的。(对于密码的值在空字符串mysql_real_connect()电话无法在一个选项文件重写,因为空字符串明确指出,MySQL帐户必须有一个空的密码。)

  • db指定一个值,无效的或空字符串

  • port,指定一个值0

  • unix_socket指定一个值,无效的

如果没有价值是在参数选项文件,其默认值是用来描述显示了在本节前面。

返回值

MYSQL*连接处理器是否连接成功,无效的如果连接不成功。一个连接成功,返回值是作为第一个参数的值相同。

错误
例子
MYSQL mysql;

mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"your_prog_name");
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

通过使用mysql_options()MySQL客户端库读取[客户][your_prog_name]部分在my.cnf文件以确保您的程序,即使有人在一些非标准的方法设置MySQL。

在连接,mysql_real_connect()重新连接国旗(部分的MYSQL结构)的一个值在旧版本的API中,或0在最新的版本。一个值这个标志表示如果因为失去而进行的一项声明不能,尝试重新连接到服务器之前放弃。你可以使用MYSQL_OPT_RECONNECT选项mysql_options()控制重行为

mysql real _ _ 27.7.7.55 _ Escape(字符串)

unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)

描述

这个函数创建使用SQL语句中的合法的SQL字符串。看到9.1.1节,“String Literals”

笔记

mysql_real_escape_string()失败并产生CR_INSECURE_API_ERR如果错误NO_BACKSLASH_ESCAPESSQL模式启用。在这种情况下,函数不能逃脱引号字符除了加倍,而要做到这一点,就必须知道更多的信息关于引用的语境比可用。相反,使用mysql_real_escape_string_quote(),这需要一个额外的参数来指定引用的上下文。

这个mysql参数必须是一个有效的,打开连接因为字符转义取决于设置服务器使用的字符。

在字符串from参数编码产生一个逃跑的SQL字符串,考虑到当前字符集的连接。结果是放在的说法,随后终止null字节。

字符编码\&#39;"(ASCII值为0),\nR,和控制Z。严格来说,MySQL只需要反斜杠和引号用来引用在查询字符串是逃走了。mysql_real_escape_string()引用其他特性使他们更容易在日志文件读取。相比之下,看到引用规则的字符串,QUOTE()SQL函数9.1.1节,“String Literals”,和12.5节,“字符串函数”

字符串所指向的from必须是长度字节。你必须分配to缓冲区是至少长×2 1字节。(在最坏的情况下,每个字符需要编码使用两个字节,而且必须终止零字节。房间)时mysql_real_escape_string()Returns,the contents of是一个空结束的字符串。返回值是编码的字符串的长度,不包括结束符null字节。

如果你必须改变设置连接的特点,使用mysql_set_character_set()而不是执行一个函数SET NAMES(或SET CHARACTER SETstatement)。mysql_set_character_set()就像SET NAMES但也影响使用的字符集的mysql_real_escape_string(),这SET NAMES

例子

下面的示例将两逃串成一个INSERT在声明中,每一个单引号字符:

char query[1000],*end;end = my_stpcpy(query,"INSERT INTO test_table VALUES('");end += mysql_real_escape_string(&mysql,end,"What is this",12);end = my_stpcpy(end,"','");end += mysql_real_escape_string(&mysql,end,"binary data: \0\r\n",16);end = my_stpcpy(end,"')");if (mysql_real_query(&mysql,query,(unsigned int) (end - query))){   fprintf(stderr, "Failed to insert row, Error: %s\n",           mysql_error(&mysql));}

这个my_stpcpy()在本例中使用的功能包括在libmysqlclient图书馆工作strcpy()但是,返回一个指向空结束的第一个参数。

返回值

编码的字符串的长度,放入to的说法,不包括结束符null字节,或1如果出现错误。

因为mysql_real_escape_string()返回一个无符号值,你可以检查1通过比较返回值(长整型)- 1(或(unsigned long)~0等价,which is)。

错误

27.7.7.56 mysql_real_escape_string_quote()

unsigned long mysql_real_escape_string_quote(MYSQL *mysql, char *to, const char *from, unsigned long length, char quote)

描述

这个函数创建使用SQL语句中的合法的SQL字符串。看到9.1.1节,“String Literals”

这个mysql参数必须是一个有效的,打开连接因为字符转义取决于设置服务器使用的字符。

在字符串from参数编码产生一个逃跑的SQL字符串,考虑到当前字符集的连接。结果是放在的说法,随后终止null字节。

字符编码\&#39;"(ASCII值为0),\nRZ,控制,和`。严格来说,MySQL只需要反斜杠和引号用来引用在查询字符串是逃走了。mysql_real_escape_string_quote()引用其他特性使他们更容易在日志文件读取。相比之下,看到引用规则的字符串,QUOTE()SQL函数9.1.1节,“String Literals”,和12.5节,“字符串函数”

笔记

如果ANSI_QUOTESSQL模式启用,mysql_real_escape_string_quote()不能用来逃避双引号字符内使用双引号的标识符。(功能无法判断模式能够确定正确的转义字符。)

字符串所指向的from必须是长度字节。你必须分配to缓冲区是至少长×2 1字节。(在最坏的情况下,每个字符需要编码使用两个字节,而且必须终止零字节。房间)时mysql_real_escape_string_quote()Returns,the contents of是一个空结束的字符串。返回值是编码的字符串的长度,不包括结束符null字节。

这个quote论证表明,逃串放在上下文。假设你打算逃避争论和插入转义字符串(这里指定的str)为以下语句:

1) SELECT * FROM table WHERE name = 'str'2) SELECT * FROM table WHERE name = "str3)选择*从`str` WHERE id = 103

执行每个语句调用适当的逃避,mysql_real_escape_string_quote()如下,在最后的论点表明引用上下文:

1) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'\'');2) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'"');3) len = mysql_real_escape_string_quote(&mysql,to,from,from_len,'`');

如果你必须改变设置连接的特点,使用mysql_set_character_set()而不是执行一个函数SET NAMES(或SET CHARACTER SETstatement)。mysql_set_character_set()就像SET NAMES但也影响使用的字符集的mysql_real_escape_string_quote(),这SET NAMES

例子

下面的示例将两逃串成一个INSERT在声明中,每一个单引号字符:

char query[1000],*end;end = my_stpcpy(query,"INSERT INTO test_table VALUES('");end += mysql_real_escape_string_quote(&mysql,end,"What is this",12,'\'');end = my_stpcpy(end,"','");end += mysql_real_escape_string_quote(&mysql,end,"binary data: \0\r\n",16,'\'');end = my_stpcpy(end,"')");if (mysql_real_query(&mysql,query,(unsigned int) (end - query))){   fprintf(stderr, "Failed to insert row, Error: %s\n",           mysql_error(&mysql));}

这个my_stpcpy()在本例中使用的功能包括在libmysqlclient图书馆工作strcpy()但是,返回一个指向空结束的第一个参数。

返回值

编码的字符串的长度,放入to的说法,不包括结束符null字节。

错误

27.7.7.57 mysql_real_query()

int mysql_real_query(MYSQL *mysql, const char *stmt_str, unsigned long length)

描述

执行SQL语句所指向的stmt_str,一个字符串长度字节。通常情况下,字符串必须包含一个SQL语句没有结束分号(;)或G。如果多个语句执行已启用,字符串可以包含多个语句用分号分隔。看到第27.7.19,“C API多语句执行的支持”

mysql_query()不能用于包含二进制数据报表;你必须使用mysql_real_query()相反。(二进制数据可能包含0性格,这mysql_query()解释为声明字符串结束。)另外,mysql_real_query()速度比mysql_query()因为它不叫strlen()on the statement的字符串。

如果你想知道该语句返回的结果集,你可以使用mysql_field_count()检查此。看到第27.7.7.22,“mysql_field_count()”

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.58 _刷新(MySQL)

int mysql_refresh(MYSQL *mysql, unsigned int options)

描述
笔记

mysql_refresh()是过时的、将在未来版本的MySQL移除。相反,使用mysql_query()执行一个FLUSH声明

此功能表或缓存刷新或重置,复制服务器信息。连接的用户必须有RELOAD特权

这个options参数是从下列值的组合构成的位掩码。多值可以or&#39;ed一起用一个简单的调用执行多个操作。

  • REFRESH_GRANT

    刷新的授权表,如FLUSH PRIVILEGES

  • REFRESH_LOG

    刷新记录,如FLUSH LOGS

  • REFRESH_TABLES

    冲表缓存,像FLUSH TABLES

  • REFRESH_HOSTS

    冲洗主机缓存,像FLUSH HOSTS

  • REFRESH_STATUS

    复位状态变量,如FLUSH STATUS

  • REFRESH_THREADS

    刷新线程缓存

  • REFRESH_SLAVE

    在从复制服务器,主服务器信息复位和重启的奴隶,像RESET SLAVE

  • REFRESH_MASTER

    在一个主复制服务器,删除在二进制日志索引列的二进制日志文件和截断的索引文件,如RESET MASTER

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.59 mysql_reload()

int mysql_reload(MYSQL *mysql)

描述

问MySQL服务器重新加载授权表。连接的用户必须有RELOAD特权

此功能已过时。使用mysql_query()发出一个SQLFLUSH PRIVILEGES语句

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.60 MySQL _ _ connection(复位)

int mysql_reset_connection(MYSQL *mysql)

描述

重置连接清晰的会话状态。

mysql_reset_connection()有类似的效果mysql_change_user()或自动重新连接,连接不关闭并重新打开,并重新验证不做。写设置会话历史复位。看到第27.7.7.3,“mysql_change_user()”)和它的第27.7.24,“C API自动重联控制”

连接相关的状态是影响如下:

  • 所有活动的事务回滚和autocommit模式复位。

  • 所有的表锁被释放

  • 全部TEMPORARY表格是封闭的(下降)。

  • 会议系统变量初始化为相应系统全局变量的值,包括通过诸如隐式地设置系统变量SET NAMES

  • 用户变量的设置都将丢失。

  • 准备财务报表发布

  • HANDLER变量是封闭的

  • 价值LAST_INSERT_ID()重置为0

  • 锁收购GET_LOCK()被释放

返回值

零成功。非零,如果发生了一个错误。

重置MySQL服务器27.7.7.61 _ _ _公共_ key()

void mysql_reset_server_public_key(void)

描述

清除所有缓存副本的RSA密钥对的密码交换服务器所需的公共密钥的客户端库。这可能是必要的当服务器已经被不同的RSA密钥对客户端程序要求重新启动后mysql_options()MySQL服务器的公共密钥_ _ _选项指定RSA公钥。在这种情况下,由于密钥不匹配会出现连接失败。为了解决这个问题,客户可以通过以下途径:

  • 客户端可以调用mysql_reset_server_public_key()清除缓存键,再试一次,之后在客户端公钥文件已包含新的公钥文件替换。

  • 客户端可以调用mysql_reset_server_public_key()清除缓存键,然后调用mysql_options()mysql_opt_get_server_public_key选项(而不是MYSQL_SERVER_PUBLIC_KEY)从服务器请求所需的公钥不使用mysql_opt_get_server_public_keyMYSQL_SERVER_PUBLIC_KEY因为在这种情况下,MySQL服务器的公共密钥_ _ _优先

返回值

错误

27.7.7.62 mysql_result_metadata()

enum enum_resultset_metadata mysql_result_metadata(MYSQL_RES *result)

描述

mysql_result_metadata()返回一个值,指示结果集元数据。它可以是有用的元数据可选连接当客户事先并不知道是否有特定的结果集元数据。例如,如果一个客户执行存储过程,返回多个结果集,可能会改变resultset_metadata系统变量,客户端可以调用mysql_result_metadata()每个结果集,以确定它是否有元数据。

有关管理结果集元数据转换的详细信息,参见第27.7.23,”C API的可选的结果集元数据

返回值

mysql_result_metadata()返回一个值:

enum enum_resultset_metadata { RESULTSET_METADATA_NONE= 0, RESULTSET_METADATA_FULL= 1};

27.7.7.63 mysql_rollback()

bool mysql_rollback(MYSQL *mysql)

描述

回滚当前事务

这个功能的作用是本课题的价值completion_type系统变量。特别是,如果有价值completion_type发布(2)、服务器进行发布终止交易后关闭客户端连接。呼叫mysql_close()从客户程序从客户端关闭连接。

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.64 MySQL _行_ seek()

MYSQL_ROW_OFFSET mysql_row_seek(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)

描述

设置任意排在查询结果集的行指针。这个offset价值是一个行偏移,通常返回值mysql_row_tell()或从mysql_row_seek()。这个值不是一个行数;寻求行内的一个结果集的数量,使用mysql_data_seek()相反

此功能需要的结果集的结构包含查询的整个结果,所以mysql_row_seek()仅可用于结合mysql_store_result(),不mysql_use_result()

返回值

该行的光标的前一个值。这个值可以通过后续的电话mysql_row_seek()

错误

27.7.7.65 _行_(MySQL)。

MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)

描述

返回最后一行光标的当前位置mysql_fetch_row()。这个值可以被用来作为一个参数mysql_row_seek()

使用mysql_row_tell()只有在mysql_store_result()之后,不mysql_use_result()

返回值

该行的游标的当前偏移。

错误

27.7.7.66 mysql_select_db()

int mysql_select_db(MYSQL *mysql, const char *db)

描述

使指定的数据库db成为默认的(电流)指定的数据库连接MySQL。在随后的查询,这个数据库是默认的表引用,包括没有明确的数据库名。

mysql_select_db()失败,除非连接的用户可以验证有权限使用的数据库。

返回值

零成功。非零,如果发生了一个错误。

错误

MySQL服务器27.7.7.67 _ _ end()

void mysql_server_end(void)

描述

这个函数完成MySQL客户端库,它应该做的当你使用完图书馆。然而,mysql_server_end()已经过时了mysql_library_end()应该用来代替。看到第27.7.7.40,“mysql_library_end()”

笔记

在应用程序是使用图书馆避免内存泄漏(例如,关闭连接到服务器后),一定要打电话mysql_server_end()(或mysql_library_end())明确。这使得内存管理进行清理和释放资源库使用的。

返回值

27.7.7.68 mysql_server_init()

int mysql_server_init(int argc, char **argv, char **groups)

描述

该函数初始化MySQL客户端库,必须在你调用任何其他MySQL函数。然而,mysql_server_init()是过时的,你应该打电话mysql_library_init()instead。这第27.7.7.41,“mysql_library_init()”

笔记

在应用程序是使用图书馆避免内存泄漏(例如,关闭连接到服务器后),一定要打电话mysql_server_end()(或mysql_library_end())明确。这使得内存管理进行清理和释放资源库使用的。看到第27.7.7.40,“mysql_library_end()”

返回值

零成功。非零,如果发生了一个错误。

27.7.7.69 mysql_session_track_get_first()

int mysql_session_track_get_first(MYSQL *mysql, enum enum_session_state_type type, const char **data, size_t *length)

描述

MySQL实现会话跟踪机制,服务器返回信息的客户端/服务器协议确定分组对会话状态的变化。这个mysql_session_track_get_first()mysql_session_track_get_next()功能使客户端应用程序提取好的分组信息。mysql_session_track_get_first()这一信息引发检索并返回它的第一部分。要检索的休息,使用mysql_session_track_get_next()

客户端应用程序控制会话状态变化信息由系统变量的名字服务器返回的形式session_track_xxx,如session_track_state_changesession_track_schema,和session_track_system_variables(见第5.1.7,服务器“系统变量”

该函数的参数如下。这些描述也适用于mysql_session_track_get_next(),以相同的参数

  • mysql程序:the connection。

  • type:检索的信息类型。此参数允许值的成员第二届会议枚举的定义mysql_com.h

    枚举enum_session_state_type { session_track_system_variables,/ * * / session_track_schema会话系统变量,/ *电流模式* / session_track_state_change,/ * * / session_track_gtids会话状态的变化,gtids / * * / / * session_track_transaction_characteristics,交易特征* / session_track_transaction_state /* */ }交易状态;

    随着时间的推移,枚举可以附加会话信息跟踪实施改变的成员。使它容易循环的会话信息的所有可能类型的成员的数目,该SESSION_TRACK_BEGINsession_track_end符号被定义为等于第一个和最后一个成员enum_session_state_type枚举。示例代码显示在本节稍后演示这种技术。(当然,如果枚举成员的变化,你必须重新编译你的应用程序能够接受新的成员。账户)

  • data地址:of the教育char *变量。继成功调用,这个变量指向返回的数据,应被视为只读。

  • length地址:of thesize_t变量。继成功调用,这个变量包含的数据长度指出的data参数.

一个成功的电话,解释data长度根据价值观type值,如下:

  • SESSION_TRACK_SCHEMA:这种类型表明默认架构已定。数据是一个包含新的默认架构名称。length是字符串的长度

    为了使跟踪型,使session_track_schema系统变量

  • SESSION_TRACK_SYSTEM_VARIABLES:这类表示一个或多个跟踪会话的系统变量被分配一个值。当一个会话的系统变量被赋值,返回变量值(每两单独调用)。对于第一个电话,数据是一个字符串包含变量名称length是字符串的长度。第二呼叫,数据是一个字符串变量值length是字符串的长度

    默认情况下,启用通知time_zoneautocommitcharacter_set_clientcharacter_set_results,和character_set_connection。要更改此跟踪类型的默认通知设置session_track_schema系统变量用逗号分隔的变量的列表来跟踪变化,或*跟踪所有变量的变化

  • SESSION_TRACK_STATE_CHANGE:这种类型表明会话状态以某些方式改变。数据是一个字节包含一个布尔标志,指示会话状态发生变化。length应该是1。国旗是代表一个ASCII值,不是一个二进制(例如,“1”,不0x01

    为了使跟踪型,使session_track_state_change系统变量

  • SESSION_TRACK_GTIDSindicates型:这是gtids是可用的。数据gtid包含编码的数据length表示数据长度。一旦数据价值已被提取,必须进一步解释为三个部分:编码规范,gtids gtids字符串的字符串的长度。目前,只有一个编码规范,所以这应该是0。的gtids字符串中标准指定一组gtid值格式。看到gtid集

    为了使跟踪型,使session_track_gtids系统变量

  • SESSION_TRACK_TRANSACTION_CHARACTERISTICS:这种类型表明交易特性是可用的。数据是一个包含数据的特点。length是字符串的长度

    交易特征跟踪让客户决定如何重新启动另一个会话的事务具有相同特征的原始会话。

    因为特征可以设置使用SET TRANSACTION在开始交易,为客户设想,如果交易不活跃没有交易的特点是不安全的。因此,不安全不跟踪的交易特征和交易不活跃的时候,只是开关连接(这是否是由交易状态跟踪或传统的检测server_status_in_trans旗)。在客户端计算机必须订阅的交易特征跟踪如果可能希望在某些时候会话切换到另一个连接和交易可。

    特征跟踪数据的字符串可能是空的,或者它可能包含一个或多个SQL语句,终止一个分号:

    • 如果不适用等特点,该字符串为空。

    • 如果一个事务已经开始,该字符串包含的语句或语句需要重启具有相同特征的交易。作为一般规则,这是一个START TRANSACTION声明(可能有一个或一个以上的只读READ WRITE,和一致的快照)。如果任何适用等特点,不能传递START TRANSACTION,如隔离级别,一个合适的SET TRANSACTION语句前缀(例如,设置一个事务的隔离级别开始读写事务处理;

    • 如果交易没有明确的开始,但一个镜头特点建立一个SET TRANSACTION适用于复制,生成安装程序语句(例如,设置只读事务

    为了使跟踪类型,设置session_track_transaction_info系统变量特点(这也使SESSION_TRACK_TRANSACTION_STATE跟踪型)

  • SESSION_TRACK_TRANSACTION_STATE这表明:交易状态信息是可用的。数据是一个包含ASCII字符,每个显示的交易状态的某些方面。length是字符串的长度(总8)。

    交易状态跟踪使客户确定交易过程中是否可以不被回滚,搬到一个不同的会话。

    跟踪项目的范围是交易。所有状态指示标志坚持到事务提交或回滚。为报表添加到交易,附加标志可以连续跟踪的数据值。然而,没有标志清零直到交易结束。

    交易状态报告为一个字符串包含ASCII字符序列。每个活动状态有其分配以及序列中的一个固定位置的独特性。下面的列表描述了允许值1到8的序列位置:

    • 职位一:是否积极的交易正在进行中。

      • T:一个明确的开始交易正在进行中。

      • I:一个隐式开始交易(autocommit=0)正在进行

      • _:没有活跃的交易

    • 职位2:非事务表是否在当前事务的上下文中读取。

      • r:一个或多个非事务表读。

      • _非事务表:没有读过

    • 职位3:无论事务表在当前事务上下文读。

      • R:一个或多个事务表读。

      • _:没有事务表读这么远。

    • 职位4:是否安全写在当前事务的上下文中执行。

      • w:一个或多个非事务表写。

      • _非事务表:不写为止

    • 职位5:是否有任何事务表被写在当前事务上下文。

      • W:一个或多个事务表写。

      • _:没有事务表写为止

    • 职位6:是否有任何不安全的声明是在当前事务的上下文中执行。

      • s一个或多个安全声明:书面(含不确定性结构如UUID()

      • _:没有不安全的语句被执行为止。

    • 职位7:是否一个结果集的当前事务中发送到客户端。

      • S:结果集发送

      • _声明没有结果集:

    • 位置8:LOCK TABLES声明是有效的

    考虑以下交易:

    SET @@session.session_track_transaction_info='STATE';
    START TRANSACTION;
    SELECT 1;
    INSERT INTO t1 () VALUES();
    INSERT INTO t1 () VALUES(1, UUID_SHORT());
    COMMIT;
    

    交易状态跟踪功能,如下data结果从这些语句:

    _ _ _ _ _ _ _ _ T _ _ _ _ _ _ _ T _ _ _ _ _ _ T S W S _ _ _ _ _ T _ _ _ WSS _ _ _ _ _ _ _ _ _

    为了使跟踪类型,设置session_track_transaction_info系统变量状态

返回值

零成功。非零,如果发生了一个错误。

错误

例子

下面的示例演示如何调用mysql_session_track_get_first()mysql_session_track_get_next()来检索并显示所有可用的会话状态变化信息的SQL语句执行成功后(表示的字符串请_ STR

printf("Execute: %s\n", stmt_str);

if (mysql_query(mysql, stmt_str) != 0)
{
  fprintf(stderr, "Error %u: %s\n",
           mysql_errno(mysql), mysql_error(mysql));
  return;
}

MYSQL_RES *result = mysql_store_result(mysql);
if (result) /* there is a result set to fetch */
{
  /* ... process rows here ... */
  printf("Number of rows returned: %lu\n",
          (unsigned long) mysql_num_rows(result));
  mysql_free_result(result);
}
else        /* there is no result set */
{
  if (mysql_field_count(mysql) == 0)
  {
    printf("Number of rows affected: %lu\n",
            (unsigned long) mysql_affected_rows(mysql));
  }
  else      /* an error occurred */
  {
    fprintf(stderr, "Error %u: %s\n",
             mysql_errno(mysql), mysql_error(mysql));
  }
}

/* extract any available session state-change information */
enum enum_session_state_type type;
for (type = SESSION_TRACK_BEGIN; type <= SESSION_TRACK_END; type++)
{
  const char *data;
  size_t length;

  if (mysql_session_track_get_first(mysql, type, &data, &length) == 0)
  {
    /* print info type and initial data */
    printf("Type=%d:\n", type);
    printf("mysql_session_track_get_first(): length=%d; data=%*.*s\n",
           (int) length, (int) length, (int) length, data);

    /* check for more data */
    while (mysql_session_track_get_next(mysql, type, &data, &length) == 0)
    {
      printf("mysql_session_track_get_next(): length=%d; data=%*.*s\n",
             (int) length, (int) length, (int) length, data);
    }
  }
}

27.7.7.70 mysql_session_track_get_next()

int mysql_session_track_get_next(MYSQL *mysql, enum enum_session_state_type type, const char **data, size_t *length)

描述

这个函数获取额外的会话状态变化信息从服务器接收,随后检索mysql_session_track_get_first()。参数mysql_session_track_get_next()是同一mysql_session_track_get_first()

一个成功的电话mysql_session_track_get_first(),叫mysql_session_track_get_next()直到它返回非零值表示没有更多的信息是可用的。调用序列mysql_session_track_get_next()是类似的,mysql_session_track_get_first()。有关更多信息及示例,演示了这两种功能,看第27.7.7.69,“mysql_session_track_get_first()”

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.71 mysql_set_character_set()

int mysql_set_character_set(MYSQL *mysql, const char *csname)

描述

这个函数是用来设置为当前连接的默认字符。字符串csname指定一个有效的字符集名称。连接整理成字符集的默认排序规则。这个功能类似SET NAMES声明还设置值MySQL -&#62;字符集,从而影响使用的字符集的mysql_real_escape_string()

返回值

零成功。非零,如果发生了一个错误。

例子
MYSQL mysql;

mysql_init(&mysql);
if (!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0))
{
    fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error(&mysql));
}

if (!mysql_set_character_set(&mysql, "utf8"))
{
    printf("New client character set: %s\n",
           mysql_character_set_name(&mysql));
}

27.7.7.72 mysql_set_local_infile_default()

void mysql_set_local_infile_default(MYSQL *mysql);

描述

LOAD DATA LOCAL INFILE回调函数内部的C客户端库使用缺省值。库调用这个函数时自动mysql_set_local_infile_handler()没有被称为或不为其每个回调提供有效的功能。

返回值

错误

27.7.7.73 mysql_set_local_infile_handler()

void mysql_set_local_infile_handler(MYSQL *mysql, int (*local_infile_init)(void **, const char *, void *), int (*local_infile_read)(void *, char *, unsigned int), void (*local_infile_end)(void *), int (*local_infile_error)(void *, char*, unsigned int), void *userdata);

描述

此功能将安装回调函数执行过程中使用LOAD DATA LOCAL INFILE声明.它使应用程序施加控制的地方(客户端)数据文件的读取。参数的连接处理,一套指向回调函数的指针,和一个数据区域,回调可以使用共享信息。

使用mysql_set_local_infile_handler(),你必须写下面的回调函数:

从intlocal _ _ init(void *指针,const char* filename,无效*用户数据);

初始化函数。这就是所谓的曾经做任何设置,打开数据文件,分配数据结构,等等。第一void**参数是一个指向指针的指针。你可以设置指针(即,* PTR)一个值将被传递到每个其他的回调函数(如void*)。回调函数可以使用这个指出维护状态信息的价值。这个用户数据论点是相同的值,通过mysql_set_local_infile_handler()

使初始化函数成功返回零,非零的错误。

int
local_infile_read(void *ptr, char *buf, unsigned int buf_len);

数据读取功能。这就是所谓的反复读取数据文件。buf点缓冲区读取数据存储,和黄色_透镜是回调可以读取和存储在缓冲区的最大字节数。(它可以读取的字节数,但不应该读更多的书。)

返回值是读取到的字节数,或为零的时候,没有更多的数据可以被读取(这表明EOF)。返回一个值小于零,如果出现错误。

void
local_infile_end(void *ptr)

终止功能。这就是所谓的后local_infile_read()返回0(EOF)或错误。在这个功能,释放任何内存分配从当地的_ _ init()和进行其他清理工作。即使是调用初始化函数返回一个错误。

int
local_infile_error(void *ptr,
                   char *error_msg,
                   unsigned int error_msg_len);

错误处理功能。这就是所谓的得到一个文本错误消息返回的情况下,你的任何其他函数返回一个错误的用户。error_msg指向缓冲区中的信息写入,和error_msg_len是缓冲区的长度。把信息作为一个null结尾的字符串,最多error_msg_len- 1号

返回的错误号

通常,其他回调存储错误消息中的数据结构所指向的ptr,所以local_infile_error()可以复制邮件到error_msg

在调用mysql_set_local_infile_handler()在你的C代码和传递指针到你的回调函数,你就可以发出LOAD DATA LOCAL INFILE声明(例如,通过使用mysql_query())。客户端库自动调用你的回调函数。指定的文件名LOAD DATA LOCAL INFILE将对第二参数传递从当地的_ _ init()回调

返回值

错误

27.7.7.74 mysql_set_server_option()

int mysql_set_server_option(MYSQL *mysql, enum enum_mysql_set_option option)

描述

启用或禁用该连接的选项。option可以是下列值之一

选项描述
MYSQL_OPTION_MULTI_STATEMENTS_ON使多个声明支持
MYSQL_OPTION_MULTI_STATEMENTS_OFF禁用多个声明支持

如果你启用了多个声明的支持,你应该获取调用结果mysql_query()mysql_real_query()利用循环调用mysql_next_result()以确定是否有更多的结果。例如,看第27.7.19,“C API多语句执行的支持”

使多个声明支持MYSQL_OPTION_MULTI_STATEMENTS_ON不使它通过具有同样的作用多客户端_ _声明国旗mysql_real_connect()多客户端_ _声明也使CLIENT_MULTI_RESULTS。如果你使用的是CALL在你的程序中的SQL语句,多个结果的支持,这意味着必须启用;选择一个多方面的选择本身是不够的,允许使用CALL

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.75 mysql_shutdown()

int mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level)

描述
笔记

mysql_shutdown()是过时的、将在未来版本的MySQL移除。相反,使用mysql_query()执行一个SHUTDOWN声明

问数据库服务器关闭。连接的用户必须有SHUTDOWN特权。MySQL服务器只支持一种关机;shutdown_level必须等于SHUTDOWN_DEFAULT。动态链接已与旧版本的编译的可执行文件libmysqlclient标题和电话mysql_shutdown()需要使用旧的libmysqlclient动态库

一种替代mysql_shutdown()是使用SHUTDOWNSQL语句

关机过程的描述第5.1.15,“服务器关机过程”

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.7.76 MySQL _ SQLSTATE(的)

const char *mysql_sqlstate(MYSQL *mysql)

描述

返回一个空字符串包含SQLSTATE错误代码最近执行的SQL语句。错误代码由五个字符。'00000'方法没有错误该值是由ANSI SQL和ODBC的指定。一个可能值的列表,参见附录B,错误,错误代码,及常见问题

SQLSTATE值返回mysql_sqlstate()不同于MySQL特定的错误号返回mysql_errno()。例如,在MySQL客户端程序显示错误使用下面的格式,在1146是的mysql_errno()价值和42s02’。”是相应的mysql_sqlstate()价值:

内核&#62;SELECT * FROM no_such_table;错误1146(42s02):表”测试。no_such_table”不存在

不是所有的MySQL错误数映射到SQLSTATE错误代码。的价值'HY000'(一般误差)用于映射的错误数。

如果你打电话mysql_sqlstate()之后mysql_real_connect()失败,mysql_sqlstate()不可能返回有用的值。例如,这种情况如果主机是服务器和连接堵塞是没有任何SQLSTATE值被发送到客户端关闭。

返回值

一个空终止字符串包含SQLSTATE错误代码。

27.7.7.77 MySQL _ _集(SSL)

bool mysql_ssl_set(MYSQL *mysql, const char *key, const char *cert, const char *ca, const char *capath, const char *cipher)

描述

mysql_ssl_set()用于建立加密连接使用SSL。这个MySQL参数必须是一个有效的连接处理。任何未使用的SSL参数可作为NULL

如果使用,mysql_ssl_set()必须调用之前mysql_real_connect()mysql_ssl_set()不支持SSL协议在客户端库启用。

它是可选的呼叫mysql_ssl_set()得到加密连接,因为默认情况下,MySQL程序试图连接使用加密如果服务器支持加密连接,返回到未加密的连接如果加密连接无法建立(见第6.4.1配置MySQL,使用加密的连接”mysql_ssl_set()可能必须指定特定的证书和密钥文件,应用程序有用的加密密码,等等。

mysql_ssl_set()指定SSL信息如建立加密连接如果连接可用的证书和密钥文件,但不执行任何要求得到的连接是加密的。需要加密连接,使用技术进行了第27.7.18,“C API加密连接支持”

对于额外的安全性相对于默认的加密设置,客户端可以提供一个CA证书匹配的一个服务器使用的身份验证,使主机名。在这种方式中,服务器和客户端在同一个地方他们信任的CA证书和客户端验证的主机,它连接的是一个打算。详情见第27.7.18,“C API加密连接支持”

mysql_ssl_set()是一个方便的功能,基本上相当于这套mysql_options()电话:

MySQL(MySQL,MySQL _ _选项选择_ _ SSL密钥,密钥);MySQL(MySQL,MySQL _ _选项选择_ SSL _证书,证书);MySQL(MySQL,MySQL _ _选项选择_ _ SSL CA,CA);MySQL(MySQL,MySQL _ _选项选择_ SSL _ capath capath);_,MySQL(MySQL,MySQL选项选择_ _ _ SSL密码,密码);

因为,对等,应用程序可以调用,而不是mysql_ssl_set(),叫mysql_options()直接调用,省略那些期权的期权价值无效的。此外,mysql_options()提供加密的连接选项不可使用mysql_ssl_set(),如mysql_opt_ssl_mode指定连接的安全状态,并MYSQL_OPT_TLS_VERSION指定的协议通过加密连接客户端允许。

争论:

  • mysql:连接句柄返回mysql_init()

  • key路径名:《客户的私人密钥文件。

  • cert路径:the name of the public key认证的客户端文件。

  • ca:证书的权威证书文件的路径名(CA)。这个选项,如果使用,必须指定的服务器使用相同的证书。

  • capath:包含受信任的SSL证书的CA文件的目录的路径名。

  • cipher:允许SSL加密的密码列表。

返回值

这个函数总是返回0。如果SSL设置不正确,随后mysql_real_connect()调用返回一个错误,当您试图连接。

27.7.7.78 MySQL _ stat()

const char *mysql_stat(MYSQL *mysql)

描述

返回一个包含类似的信息,所提供的字符串并发数命令。这包括正常运行时间在几秒钟内,正在运行的线程,数问题,重新加载,和打开的表。

返回值

该字符串描述服务器的状态。NULL如果发生了一个错误

错误

27.7.7.79 mysql result()_ _商店

MYSQL_RES *mysql_store_result(MYSQL *mysql)

描述

在调用mysql_query()mysql_real_query(),你必须调用mysql_store_result()mysql_use_result()每一个声明,成功地生产出一个结果集(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE我知道,和四)。You must also呼叫mysql_free_result()当你这样做的结果集

你不需要打电话mysql_store_result()mysql_use_result()对于其他报表,但它不会做任何伤害或造成任何明显的性能下降,如果你打电话mysql_store_result()在所有的情况下。你可以检测是否语句的结果集通过检查是否mysql_store_result()返回一个非零值(更多关于这个版本)。

如果你启用了多个声明的支持,你应该获取调用结果mysql_query()mysql_real_query()利用循环调用mysql_next_result()以确定是否有更多的结果。例如,看第27.7.19,“C API多语句执行的支持”

如果你想知道一个语句将返回一个结果集,你可以使用mysql_field_count()检查此。看到第27.7.7.22,“mysql_field_count()”

mysql_store_result()读取一个查询到客户的整个结果,分配MySQL是_结构,并把结果到这个结构。

mysql_store_result()返回一个空指针如果语句没有返回一个结果集(例如,如果它是一个INSERTstatement)。

mysql_store_result()同时返回一个空指针如果结果阅读设置失败。您可以检查是否通过检查是否发生了一个错误mysql_error()返回一个空字符串,mysql_errno()返回非零值,或mysql_field_count()返回零

一个空的结果集返回如果没有返回的行。(一个空结果集与一个空指针作为返回值。)

当你叫mysql_store_result()和回到一个结果,不是一个空指针,你可以打电话mysql_num_rows()找出了多少行的结果集。

你可以打电话mysql_fetch_row()从获取结果集的行,或mysql_row_seek()mysql_row_tell()获取或设置当前行的位置在结果集。

看到第27.7.25.1,“为什么mysql_store_result()有时返回后mysql_query()返回成功”

返回值

MYSQL_RES结果结果结构无效的(0)如果发生错误

错误

mysql_store_result()重置mysql_error()mysql_errno()如果它成功了

27.7.7.80 mysql_thread_id()

unsigned long mysql_thread_id(MYSQL *mysql)

描述

返回当前连接的线程的ID。这个值可以被用来作为一个参数mysql_kill()杀线

如果连接丢失和你联系mysql_ping()线程ID的变化。这意味着你不应该得到的线程ID和存储供以后。你应该得到它,当你需要它的时候。

笔记

这个函数不如果线程ID是大于32位的正常工作,可以在一些系统发生。要避免的问题mysql_thread_id(),不要使用它。获得连接ID,执行选择connection_id()查询和检索结果

返回值

当前连接的线程的ID。

错误

27.7.7.81 mysql_use_result()

MYSQL_RES *mysql_use_result(MYSQL *mysql)

描述

在调用mysql_query()mysql_real_query(),你必须调用mysql_store_result()mysql_use_result()每一个声明,成功地生产出一个结果集(SELECTSHOWDESCRIBEEXPLAINCHECK TABLE我知道,和四)。You must also呼叫mysql_free_result()当你这样做的结果集

mysql_use_result()启动一个结果集检索但不实际阅读设置成客户喜欢的结果mysql_store_result()做.相反,每一行必须单独通过电话进行检索mysql_fetch_row()。这是查询的结果直接从服务器没有存储在临时表或本地缓存,这是有点快,占用更少的内存比mysql_store_result()。客户端分配内存仅为当前行和通信缓冲区会长大max_allowed_packet字节

另一方面,你不应该使用mysql_use_result()锁定读如果你做很多处理每一行在客户端,或者输出到屏幕上,用户可以键入&#62;&#62;(停止滚动)。这关系到服务器,并防止其他线程更新任何表中获取数据时。

当使用mysql_use_result()的,你必须执行mysql_fetch_row()直到无效的返回值,否则,该unfetched行作为结果的一部分设置为你的下一个查询返回。C API给出误差Commands out of sync; you can't run this command now如果你忘记做这个!

你不可以使用mysql_data_seek()mysql_row_seek()mysql_row_tell()mysql_num_rows(),或mysql_affected_rows()一个返回的结果mysql_use_result()也可能你的问题,直到其他查询mysql_use_result()已完成。(但是,在你了所有的行,mysql_num_rows()准确地返回的行数了。)

你必须调用mysql_free_result()一旦你这样做的结果集。

返回值

MYSQL_RES结果结构无效的如果发生了一个错误

错误

mysql_use_result()重置mysql_error()mysql_errno()如果它成功了

27.7.7.82 mysql_warning_count()

unsigned int mysql_warning_count(MYSQL *mysql)

描述

返回的错误、警告的数量,和以前的SQL语句执行过程中产生的笔记。

返回值

警告计数

错误

27.7.8 C API的准备好的语句

MySQL客户端/服务器协议提供准备好的语句的使用。此功能使用MYSQL_STMT在返回语句句柄的数据结构mysql_stmt_init()初始化函数。准备执行是执行一个语句一次以上的有效途径。语句进行解析,为执行做准备。然后执行一次或更多的时候,使用报表处理程序由初始化函数返回。

准备执行比执行一次以上语句直接执行速度快,主要是因为查询进行解析,只有一次。在直接执行的情况下,查询解析每一次执行。准备好的执行还可以提供一种减少网络流量,因为该声明每个执行,只需发送数据的参数。

准备好的语句可能不提供在某些情况下,性能的提高。最好的结果是,测试你的应用与制备和nonprepared陈述和选择产生最佳的性能。

准备好的语句的另一个优点是,它使用一个二进制协议使得客户端和服务器之间的数据传输更高效。

一个表的SQL语句,可以作为编制报表,看13.5节,“编写SQL语句语法”

元数据更改表或视图被准备语句检测导致语句自动复配时,下一个执行。有关更多信息,参见8.10.3节,“缓存的准备好的语句和存储的程序”

27.7.9 C API编写报表的数据结构

准备好的语句使用的几种数据结构:

  • 获得句柄声明,通过MYSQL连接句柄mysql_stmt_init(),它返回一个指向函数的指针_ MySQL语句数据结构。这种结构用于进一步操作的语句。指定要准备的声明中,通过MYSQL_STMT声明指针和字符串mysql_stmt_prepare()

  • 在一份准备好的声明中提供输入参数,设置MYSQL_BIND结构和传递给mysql_stmt_bind_param()。接收输出列的值,设置MySQL _绑定结构和传递给mysql_stmt_bind_result()

  • 这个MYSQL_TIME结构是用来在两个方向上传输时间数据。

下面的讨论描述了事先准备好的声明数据类型的详细介绍。为例,说明如何使用它们,看第27.7.11.10,“mysql_stmt_execute()”,和第27.7.11.11,“mysql_stmt_fetch()”

  • MYSQL_STMT

    这个结构是一个准备好的声明的处理程序。处理程序是通过调用mysql_stmt_init(),它返回一个指向函数的指针_ MySQL语句。处理程序是用于声明的所有后续操作直到你关闭它mysql_stmt_close(),此时处理无效,应不再使用。

    这个MYSQL_STMT结构没有成员用于应用程序的使用。应用程序不应该试图复制_ MySQL语句结构。有没有保证,这样的副本将被使用。

    多语句句柄可以用一个单一的连接相关。在处理数的限制取决于可用的系统资源。

  • MYSQL_BIND

    这种结构用于语句的输入(数据值发送到服务器)和输出(结果值从服务器返回的):

    使用MYSQL_BIND其内容结构、零初始化,然后设置其成员适当。例如,声明和初始化的数组MySQL _绑定结构,使用此代码:

    MYSQL_BIND bind[3];
    memset(bind, 0, sizeof(bind));
    

    这个MYSQL_BIND结构包含用于应用程序的以下成员。几个成员,使用的方式取决于结构用于输入或输出。

    • enum enum_field_types buffer_type

      缓冲区的类型。这个成员表示数据类型的C语言变量绑定到参数声明或结果集的列。输入,buffer_type显示包含的值被发送到服务器的变量的类型。输出,它指示型变量的值从服务器接收应存放。允许的buffer_type值,见第27.7.9.1,“C API编写的语句类型代码”

    • void *buffer

      一个指向缓冲区用于数据传输。这是一个C语言变量的地址。

      输入,buffer是一个指针变量中存储的参数声明你的数据值。当你打电话mysql_stmt_execute()MySQL的使用,存储在变量中声明相应的参数标记的值(指定地点在语句的字符串)

      输出,buffer是一个指向该变量返回一个结果集的列值。当你打电话mysql_stmt_fetch(),MySQL存储列值从这个变量设置结果的当前行。您可以访问的值在调用返回时。

      尽量减少对MySQL进行类型转换C语言值之间的客户端和服务器端SQL值需要使用C变量有类型相同的值对应的SQL:

      • 数字数据类型,buffer应该指向适当的数值型变量。整数变量(可烧焦对于单字节的值或值越大整数类型),你也应该指示变量是否有unsigned属性设置is_unsigned成员,稍后介绍

      • 字符(二进制)和二进制字符串数据类型,buffer应该指向字符缓冲区

      • 日期和时间数据类型,buffer应该指出,一个MySQL _时结构

      关于C的类型及类型转换的SQL类型和音符之间的映射规则,看第27.7.9.1,“C API编写的语句类型代码”,和第27.7.9.2,“C API编写的语句类型转换”

    • unsigned long buffer_length

      的实际大小*buffer在字节。这表明数据可以存储在缓冲区的最大数量。字符和二进制数据,这buffer_length值指定长度*buffer当使用mysql_stmt_bind_param()指定的输入值,或是输出数据字节可以读取到缓冲区使用时的最大数量mysql_stmt_bind_result()

    • unsigned long *length

      一个指针的unsigned long变量表示的数据存储的实际字节数*缓冲length用于字符或二进制数据。

      输入参数数据绑定,设置*length显示存储在参数值的实际长度*缓冲。这是利用mysql_stmt_execute()

      输出值绑定,MySQL的设置*length当你打电话mysql_stmt_fetch()。这个mysql_stmt_fetch()返回的值决定如何解释长度:

      • 如果返回值为0,*length指示参数值的实际长度。

      • 如果返回值是MYSQL_DATA_TRUNCATED*长度指示参数值的截断长度。在这种情况下,最低*lengthbuffer_length提示目前的价值

      length是数字和时间数据类型的忽视,因为buffer_typedetermines the length of the value值的日期。

      如果你必须在取它确定一个返回值的长度,看第27.7.11.11,“mysql_stmt_fetch()”一些策略

    • bool *is_null

      这个成员指向一个bool如果一个变量的值无效的如果不是,假NULL。输入设置* is_null真正的表明你经过一个NULL值作为参数的声明

      is_null是一个指针一个布尔标量,不是一个布尔标量,提供在你指定的灵活性NULL价值观:

      • 如果你的数据值总是NULL,使用MySQL _型_零作为buffer_type当你the column value绑定。the otherMySQL _绑定成员,包括is_null不,不

      • 如果你的数据值总是NOT NULL,集is_null = (bool*) 0,和组内其他成员适当地为你的变量绑定。

      • 在所有其他情况下,组内其他成员适当的设置is_null到一个地址布尔变量。设置变量的值为true或false之间适当执行指示相应的数据值NULL不为空,分别

      输出,当你取行,MySQL设置指向的值is_null为真或假,根据是否从语句返回的结果集的列值是或不是无效的

    • bool is_unsigned

      这个会员申请C变量的数据类型,可以unsigned烧焦short intintlong long int)。集is_unsigned如果要真正指向的变量buffer无符号否则为假。例如,如果你与一个signed char变量缓冲区,指定类型编码MYSQL_TYPE_TINY并设置is_unsigned假。如果你把一个unsigned char相反,这类代码是相同的is_unsigned应该是真的。(为char,它没有定义是否有符号或无符号的,所以最好是明确有无符号的运用符号unsigned char。)

      is_unsigned只适用于C语言的变量在客户端。它表明没有相应的SQL服务器上的符号价值。例如,如果你使用一个int变为一个提供价值BIGINT UNSIGNED柱,is_unsigned应该是假的,int是一个符号类型。如果你使用一个无符号整型变为一个提供价值BIGINT柱,is_unsigned应该是真的因为unsigned int是一个无符号类型。MySQL的执行之间的有符号和无符号值在两个方向上的适当的转换,但如果截断结果发生警告。

    • bool *error

      输出,设置这个成员指bool变量有截断信息的参数存储在一个取行术后。当截断报告启用,mysql_stmt_fetch()退货mysql_data_truncated*error是真的MySQL _绑定在截断发生结构参数。截断指示标志或重要数字丢失,或一个字符串太长,在一个合适的柱。截断报告是默认启用的,但可以通过调用mysql_options()MySQL的_ _截断_报告日期选项

  • MYSQL_TIME

    这种结构是用来发送和接收DATETIMEDATETIME,和TIMESTAMP数据直接从服务器。设置缓冲区成员指MYSQL_TIME结构,并设置buffer_type中的成员MYSQL_BIND结构的一个时态类型(MySQL _型_时MYSQL_TYPE_DATEmysql_type_datetimeMYSQL_TYPE_TIMESTAMP

    这个MYSQL_TIME结构包含下表中列出的成员。

    会员描述
    unsigned int year
    unsigned int month今年的月
    unsigned int day月的一天
    unsigned int hour小时的一天
    unsigned int minute这一小时的分钟
    unsigned int second分钟的第二
    bool neg一个布尔值,指示标志是否时间是负的
    unsigned long second_part以第二小数部分

    只有一部分MYSQL_TIME结构,适用于一个给定的时间值类型的使用。这个month,和元素用于DATEDATETIME,和TIMESTAMP价值观。这个小时minute,和第二元素用于TIMEDATETIME,和TIMESTAMP价值观。看到第27.7.20,“C API声明的日期和时间值的处理

27.7.9.1 C API编写的语句类型代码

这个buffer_type成员MySQL _绑定结构表示数据类型的C语言变量绑定到参数声明或结果集的列。输入,buffer_type显示包含的值被发送到服务器的变量的类型。输出,它指示型变量的值从服务器接收应存放。

下表显示的允许值buffer_type成员MySQL _绑定输入值结构发送到服务器。表格显示的C变量类型,你可以使用相应的类型代码和SQL数据类型的值可以不使用转换。选择buffer_type值,根据数据类型的C语言的变量,你的结合。对于整数类型,还应该设置is_unsigned成员指示变量是有符号或无符号。

输入变量c型buffer_type价值目标值的SQL类型
signed charMYSQL_TYPE_TINYTINYINT
short intMYSQL_TYPE_SHORTSMALLINT
intMYSQL_TYPE_LONGINT
long long intMYSQL_TYPE_LONGLONGBIGINT
floatMYSQL_TYPE_FLOATFLOAT
doubleMYSQL_TYPE_DOUBLEDOUBLE
MYSQL_TIMEMYSQL_TYPE_TIMETIME
MYSQL_TIMEMYSQL_TYPE_DATEDATE
MYSQL_TIMEMYSQL_TYPE_DATETIMEDATETIME
MYSQL_TIMEMYSQL_TYPE_TIMESTAMPTIMESTAMP
char[]MYSQL_TYPE_STRINGTEXTCHARVARCHAR
char[]MYSQL_TYPE_BLOBBLOBBINARYVARBINARY
MYSQL_TYPE_NULLNULL

使用MYSQL_TYPE_NULL至于所描述_是零成员第27.7.9,“C API编写报表数据结构”

输入的字符串数据,使用MYSQL_TYPE_STRINGMySQL _ _ BLOB类型取决于的值是一个字符或二进制字符串(二进制):

  • MYSQL_TYPE_STRING显示字符的输入字符串数据。价值是在字符集表示的character_set_client系统变量。如果服务器存储值到一个不同的字符集的列,它将该值转换,字符集。

  • MYSQL_TYPE_BLOB表示二进制输入字符串数据。的值被视为具有二元的字符集。那就是,它被视为一个字节的字符串并没有发生转换。

下表显示的允许值buffer_type成员MySQL _绑定从服务器接收到的输出值的结构。表显示接收值的SQL类型,相应的类型代码,结果集元数据有这样的价值观,和推荐的C语言数据类型绑定到MYSQL_BIND结构受SQL值无需转换。选择buffer_type值,根据数据类型的C语言的变量,你的结合。对于整数类型,还应该设置is_unsigned成员指示变量是有符号或无符号。

接收值的SQL类型buffer_type价值输出变量C型
TINYINTMYSQL_TYPE_TINYsigned char
SMALLINTMYSQL_TYPE_SHORTshort int
MEDIUMINTMYSQL_TYPE_INT24int
INTMYSQL_TYPE_LONGint
BIGINTMYSQL_TYPE_LONGLONGlong long int
FLOATMYSQL_TYPE_FLOATfloat
DOUBLEMYSQL_TYPE_DOUBLEdouble
DECIMALMYSQL_TYPE_NEWDECIMALchar[]
YEARMYSQL_TYPE_SHORTshort int
TIMEMYSQL_TYPE_TIMEMYSQL_TIME
DATEMYSQL_TYPE_DATEMYSQL_TIME
DATETIMEMYSQL_TYPE_DATETIMEMYSQL_TIME
TIMESTAMPMYSQL_TYPE_TIMESTAMPMYSQL_TIME
CHARBINARYMYSQL_TYPE_STRINGchar[]
VARCHARVARBINARYMYSQL_TYPE_VAR_STRINGchar[]
TINYBLOBTINYTEXTMYSQL_TYPE_TINY_BLOBchar[]
BLOBTEXTMYSQL_TYPE_BLOBchar[]
MEDIUMBLOBMEDIUMTEXTMYSQL_TYPE_MEDIUM_BLOBchar[]
LONGBLOBLONGTEXTMYSQL_TYPE_LONG_BLOBchar[]
BITMYSQL_TYPE_BITchar[]

27.7.9.2 C API编写的语句类型转换

准备好的语句发送客户端和使用C语言的变量在客户端与服务器端的SQL Server之间的数据值。如果有一个不匹配的C变量类型之间在客户端和服务器端相应的SQL类型的值,MySQL执行双向隐式类型转换。

MySQL能在服务器端SQL值类型代码。这个buffer_type中的价值MySQL _绑定结构表明C变量保存的值在客户端类型代码。两码一起告诉MySQL什么转换必须执行,如果任何。这里是一些例子:

  • 如果你使用MYSQL_TYPE_LONG一个int变量传递一个整型值的服务器是被存储到FLOAT列,MySQL将该值转换浮点格式保存它之前。

  • 如果你拿一个SQLMEDIUMINT列的值,但specify Abuffer_type价值MYSQL_TYPE_LONGLONG使用C类型的变量双长整型作为目的地缓冲,MySQL将MEDIUMINT值(要求小于8字节)存储到双长整型(年变数)

  • 如果你把一个数字列的值变为char[4]字符数组中指定一个buffer_type价值MYSQL_TYPE_STRING,产生的数组中的值是一个4字节的字符串“255 \0’

  • MySQL的回报DECIMAL值作为原始服务器端的值的字符串表示形式,这就是为什么相应的C型字符[ ]。例如,12.345返回到客户端“12.345”。如果你指定MYSQL_TYPE_NEWDECIMAL将一个字符串缓冲区的MySQL _绑定结构,mysql_stmt_fetch()存储在缓冲区的值作为一个字符串不转换。如果你指定一个数值变量和类型代码,mysql_stmt_fetch()将字符串格式DECIMAL基于数字值的形式

  • 对于MYSQL_TYPE_BIT类型代码,BIT值返回到一个字符串缓冲区,所以相应的C型字符[ ]。价值是一个字符串,需要在客户端解释。作为一个类型,是比较容易处理的返回值,你可以使值被转换为整数,可以使用下列类型的表达式:

    SELECT bit_col + 0 FROM t
    SELECT CAST(bit_col AS UNSIGNED) FROM t
    

    要检索的值,绑定一个足以容纳值,指定适当的相应的整数类型代码整数变量。

在绑定变量的MYSQL_BIND这是用于获取列值的结构,你可以检查类型代码的每一列的结果集。这可能是理想的如果你想确定哪些变量类型,最好使用以避免类型转换。获取类型代码,调用mysql_stmt_result_metadata()准备语句后执行mysql_stmt_execute()。元数据提供结果的类型代码访问设置描述第27.7.11.23,“mysql_stmt_result_metadata()”,和第27.7.5,“C API的数据结构”

确定是否在结果输出字符串的值集从服务器返回包含二进制或数据,检查是否charsetnr结果集元数据值为63(见第27.7.5,“C API的数据结构”)。如果是这样的话,人物的设置binary,这表明二进制而不是二进制数据。这使您可以区分BINARYCHARVARBINARYVARCHAR,和BLOB类型从TEXT类型

如果你的原因max_length的成员mysql_field列的元数据结构被设置(通过调用mysql_stmt_attr_set()),要知道,max_length结果集的值表示的值的字符串表示形式的长度最长,不是二进制表示的长度。这是,max_length不一定对应于所需的值取用语句编写的二进制协议的缓冲区的大小。选择缓冲区的大小根据类型的变量的值,你拿。例如,一个TINYINT列包含值128可能有一个max_length值4。但任何二进制表示TINYINT值需要存储1字节,所以你可以提供signed char变量中存储值和设定is_unsigned表明值签署

元数据更改表或视图被准备语句检测导致语句自动复配时,下一个执行。有关更多信息,参见8.10.3节,“缓存的准备好的语句和存储的程序”

27.7.10 C API编写的语句功能概述

下面的列表总结了可用于制备报表处理功能。为更详细的描述,参见第27.7.11,“C API编写的语句功能说明”

呼叫mysql_stmt_init()创建处理程序声明,然后mysql_stmt_prepare()准备语句字符串,mysql_stmt_bind_param()提供的参数数据,并mysql_stmt_execute()执行该语句。你可以重复mysql_stmt_execute()通过改变参数值通过各自的缓冲区mysql_stmt_bind_param()

你可以发送文本或二进制数据块服务器使用mysql_stmt_send_long_data()。看到第27.7.11.26,“mysql_stmt_send_long_data()”

如果这段时间是SELECT或任何其他语句产生一个结果集,mysql_stmt_prepare()返回结果集的元数据信息的形式MySQL是_结果通过mysql_stmt_result_metadata()

你可以提供结果缓冲区使用mysql_stmt_bind_result(),使mysql_stmt_fetch()自动返回数据,这些缓冲区。这是按行读取。

当语句执行完毕后,关闭报表处理程序使用mysql_stmt_close()因此,与之相关的所有资源可以被释放。在这一点上,处理无效,应不再使用。

如果你得到了一个SELECT语句的结果集元数据通过调用mysql_stmt_result_metadata(),你也应该免费使用的元数据mysql_free_result()

执行步骤

准备和执行语句,应用程序遵循以下步骤:

  1. 创建一个语句编写处理程序mysql_stmt_init()。准备服务器上的声明,称mysql_stmt_prepare()它传递一个字符串包含的SQL语句。

  2. 如果语句将产生一个结果集,叫mysql_stmt_result_metadata()获得结果集元数据。此元数据本身在结果集的形式,尽管从一个包含由查询返回的行的不同的一个。结果集的元数据显示多少列在结果,包含每一列的信息。

  3. 设置任何参数值mysql_stmt_bind_param()。所有参数必须设置。否则,执行语句将返回一个错误或产生意想不到的结果。

  4. 呼叫mysql_stmt_execute()执行该语句

  5. 如果语句产生一个结果集,绑定数据缓冲器用于检索的行的值通过调用mysql_stmt_bind_result()

  6. 读取数据到缓冲区排排通过调用mysql_stmt_fetch()直到没有更多的行被发现。

  7. 重复步骤3到6是必要的,通过改变参数值,再执行语句。

什么时候mysql_stmt_prepare()称,MySQL客户端/服务器协议执行这些动作:

  • 服务器解析语句并将好的状态返回给客户端分配一个ID,它也发出声明参数的总数,列数,其元数据,如果它是一个结果导向的声明。所有的语法和语义的声明是由服务器在访问过程中检查。

  • 客户端使用这个声明ID为进一步的操作,使得服务器能够识别从池中的声明语句。

什么时候mysql_stmt_execute()称,MySQL客户端/服务器协议执行这些动作:

  • 客户端使用报表处理和发送数据到服务器的参数。

  • 服务器识别的语句中使用由客户提供的身份证,与新提供的数据替代参数标记,然后执行语句。如果语句产生一个结果集,该服务器将数据返回给客户端。否则,它会发送一个好的状态和行数的改变,删除或插入。

什么时候mysql_stmt_fetch()称,MySQL客户端/服务器协议执行这些动作:

  • 客户端读取数据从结果集和地方它当前行到应用程序的数据缓冲区做必要的转换。如果应用程序缓冲式相同,从服务器返回的字段类型,转换简单。

如果出现错误,你可以声明错误号的错误信息,和SQLSTATE代码使用mysql_stmt_errno()mysql_stmt_error(),和mysql_stmt_sqlstate()很好

事先准备好的声明测井

准备语句执行的mysql_stmt_prepare()mysql_stmt_execute()C API函数,服务器写准备Execute线的通用查询日志,你可以告诉当报表的编制和执行。

假设你准备和执行语句如下:

  1. 呼叫mysql_stmt_prepare()准备语句字符串“选择?”

  2. 呼叫mysql_stmt_bind_param()绑定的值该参数在事先准备好的声明。

  3. 呼叫mysql_stmt_execute()执行准备好的语句

由于前面的调用,服务器写如下的通用查询日志:

Prepare  [1] SELECT ?
Execute  [1] SELECT 3

每个Prepare执行线标记A是在日志[N]声明的标识符,你可以跟踪哪些语句被记录。N是一个正整数。如果有多个活动同时为客户准备好的语句,N可能大于1。每个执行线显示一个准备好的声明中对数据的值替代后?参数.

27.7.11 C API编写的语句功能说明

准备和执行查询,将在下面的章节中详细描述的功能。

所有的功能操作,以MYSQL_STMT结构开始的前缀MySQL _ stmt _

创建一个MYSQL_STMT处理程序,使用mysql_stmt_init()功能

27.7.11.1 mysql_stmt_affected_rows()

my_ulonglong mysql_stmt_affected_rows(MYSQL_STMT *stmt)

描述

mysql_stmt_affected_rows()可执行语句后立即打电话mysql_stmt_execute()。它像mysql_affected_rows()但对于准备好的语句。为了说明受影响的行的值返回此功能意味着,看第27.7.7.1,“mysql_affected_rows()”

错误

27.7.11.2 MySQL支撑_ _ attr _ get()

bool mysql_stmt_attr_get(MYSQL_STMT *stmt, enum enum_stmt_attr_type option, void *arg)

描述

可以用来获取属性声明中的当前值。

这个option的说法是,你想要的选项;精氨酸应该指向一个变量应该包含的期权价值。如果期权是一个整数,arg应该指向整数的值

看到第27.7.11.3,“mysql_stmt_attr_set()”,for a list of选项和选项的类型。

返回值

成功的为零。非零如果option是未知的

错误

27.7.11.3 MySQL支撑_ _ _属性集()

bool mysql_stmt_attr_set(MYSQL_STMT *stmt, enum enum_stmt_attr_type option, const void *arg)

描述

可以用来对一个准备好的声明的行为。这个函数可以被多次设置几个选项。

这个option一个说法是你想设置的选项。这个精氨酸参数是期权的价值arg应该指出,设置所需的属性值的变量。变量类型如下表所示。

下表显示了可能的option价值观

选项参数类型功能
STMT_ATTR_UPDATE_MAX_LENGTHbool *如果设置为1,使mysql_stmt_store_result()更新元数据mysql_field -&#62; max_length价值
STMT_ATTR_CURSOR_TYPEunsigned long *类型的游标打开时声明mysql_stmt_execute()是援引*精氨酸可以是CURSOR_TYPE_NO_CURSOR(默认)或cursor_type_read_only
STMT_ATTR_PREFETCH_ROWSunsigned long *获取从服务器在同一时间使用光标时的行数。*arg可以在范围从1到最大值无符号长。默认值是1

如果你使用STMT_ATTR_CURSOR_TYPE选项cursor_type_read_only,一打开游标的语句当你调用mysql_stmt_execute()。如果已经有从先前打开的游标mysql_stmt_execute()电话,关闭游标打开一个新的人之前。mysql_stmt_reset()同时关闭任何打开的游标之前准备重新执行语句。mysql_stmt_free_result()关闭任何打开的游标

如果你在一份准备好的声明中打开一个游标,mysql_stmt_store_result()是不必要的,因为函数使结果集缓存在客户端。

返回值

成功的为零。非零如果option是未知的

错误

例子

下面的示例打开一个游标声明和集取一次5行数:

MYSQL_STMT *stmt;
int rc;
unsigned long type;
unsigned long prefetch_rows = 5;

stmt = mysql_stmt_init(mysql);
type = (unsigned long) CURSOR_TYPE_READ_ONLY;
rc = mysql_stmt_attr_set(stmt, STMT_ATTR_CURSOR_TYPE, (void*) &type);
/* ... check return value ... */
rc = mysql_stmt_attr_set(stmt, STMT_ATTR_PREFETCH_ROWS,
                         (void*) &prefetch_rows);
/* ... check return value ... */

27.7.11.4 MySQL _ stmt _ _绑定参数()

bool mysql_stmt_bind_param(MYSQL_STMT *stmt, MYSQL_BIND *bind)

描述

mysql_stmt_bind_param()用于SQL语句中的参数标记,通过将输入数据mysql_stmt_prepare()。它使用MySQL _绑定结构提供数据bind是一个数组的地址MySQL _绑定结构.客户端库预计阵列包含每一个元素?参数标记是在查询当前。

假设你准备以下声明:

INSERT INTO mytbl VALUES(?,?,?)

当你绑定的参数数组MYSQL_BIND结构必须包含三个元素,可以这样声明:

MySQL _卷卷[ 3 ];

第27.7.9,“C API编写报表数据结构”,描述了每个成员MYSQL_BIND元和他们应该如何设置提供输入值。

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.11.5 mysql_stmt_bind_result()

bool mysql_stmt_bind_result(MYSQL_STMT *stmt, MYSQL_BIND *bind)

描述

mysql_stmt_bind_result()用于关联(即绑定)输出结果集中的列的数据缓冲区和缓冲区长度。什么时候mysql_stmt_fetch()称取数据,MySQL客户端/服务器协议将数据绑定列为指定的缓冲区。

所有列必须缓冲之前调用mysql_stmt_fetch()绑定是一个数组的地址MYSQL_BIND结构.客户端库预计数组包含一个元素,每一列的结果集。如果你不绑定的列MySQL _绑定结构,mysql_stmt_fetch()只是忽略了数据提取。缓冲区必须足够大以容纳数据的值,因为该协议不以块的形式返回数据值。

可以将列绑定或随时反弹,即使已部分检索结果集。新的绑定生效一次mysql_stmt_fetch()被称为。假设应用程序绑定列的结果集和电话mysql_stmt_fetch()。客户机/服务器协议返回绑定缓存数据。然后,假设应用程序绑定的列为一组不同的缓冲区。该协议将数据绑定到新的缓冲区,当下次调用mysql_stmt_fetch()发生.

绑定列,应用程序调用mysql_stmt_bind_result()通过类型、地址和长度的输出缓冲区中的值应存放。第27.7.9,“C API编写报表数据结构”,描述了每个成员MYSQL_BIND元和他们应该如何设置为接收输出值。

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.11.6 _为_ mysql close()

bool mysql_stmt_close(MYSQL_STMT *stmt)

描述

关闭声明mysql_stmt_close()同时释放这个语句句柄指向的支撑在这一点上,它变得无效,不应再使用。一个失败的mysql_stmt_close()打电话,不打电话mysql_stmt_error(),或mysql_stmt_errno(),或mysql_stmt_sqlstate()获取错误信息的原因mysql_stmt_close()使语句句柄无效。呼叫mysql_error()mysql_errno(),或mysql_sqlstate()相反

如果当前语句有未决或未读的结果,此功能取消它们,接下来的查询可以执行。

返回值

零成功。非零,如果发生了一个错误。

错误

MySQL的日期为27.7.11.7 _ _ _ seek()

void mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset)

描述

求任意排在结果的声明。这个offset价值是一个行数和应在的范围从mysql_stmt_num_rows(stmt)-1

此功能需要的语句的结果集的结构包含了最后执行查询整个结果,所以mysql_stmt_data_seek()仅可用于结合mysql_stmt_store_result()

返回值

错误

27.7.11.8 mysql errno(_ _支撑)

unsigned int mysql_stmt_errno(MYSQL_STMT *stmt)

描述

指定的声明stmtmysql_stmt_errno()返回最近调用API函数的声明可以成功或失败,错误代码。一个零意味着没有发生错误返回值。客户端错误消息号在MySQL上市errmsg。H头文件。服务器错误消息号列mysqld_error.h。错误也列在附录B,错误,错误代码,及常见问题

如果没有声明API函数mysql_stmt_close(),不打电话或mysql_stmt_errno()获取错误信息的原因mysql_stmt_close()使语句句柄无效。呼叫mysql_errno()相反

返回值

错误代码值。零如果没有发生错误。

错误

27.7.11.9 mysql_stmt_error()

const char *mysql_stmt_error(MYSQL_STMT *stmt)

描述

指定的声明stmtmysql_stmt_error()返回一个空字符串包含最近调用API函数的声明,可以成功或失败的错误信息。一个空字符串(“”如果没有发生错误返回)。两试验可用于检查错误:

if(*mysql_stmt_errno(stmt))
{
  // an error occurred
}

if (mysql_stmt_error(stmt)[0])
{
  // an error occurred
}

如果没有声明API函数mysql_stmt_close(),不叫mysql_stmt_error()获取错误信息的原因mysql_stmt_close()使语句句柄无效。呼叫mysql_error()相反

客户的错误消息的语言可以通过重新编译MySQL客户端库的变化。你可以选择几种不同的语言错误消息。

返回值

一个字符串,描述错误。如果没有错误发生,一个空字符串。

错误

27.7.11.10 mysql_stmt_execute()

int mysql_stmt_execute(MYSQL_STMT *stmt)

描述

mysql_stmt_execute()执行查询语句处理相关准备。当前绑定的参数标记的值是在呼叫发送到服务器,与服务器替换标记这个新提供的数据。

语句处理如下mysql_stmt_execute()取决于语句类型:

语句产生一个结果集,你可以要求mysql_stmt_execute()通过调用打开一个游标的语句mysql_stmt_attr_set()在执行该语句。如果你执行一个语句多次,mysql_stmt_execute()任何打开的游标打开一个新的人之前关闭。

元数据更改表或视图被准备语句检测导致语句自动复配时,下一个执行。有关更多信息,参见8.10.3节,“缓存的准备好的语句和存储的程序”

返回值

零成功。非零,如果发生了一个错误。

错误
例子

下面的示例演示如何创建和填充一个表使用mysql_stmt_init()mysql_stmt_prepare()mysql_stmt_param_count()mysql_stmt_bind_param()mysql_stmt_execute(),和mysql_stmt_affected_rows()。这个MySQL变量被认为是一个有效的连接处理。为例,说明如何检索数据,看第27.7.11.11,“mysql_stmt_fetch()”

#define STRING_SIZE 50

#define DROP_SAMPLE_TABLE "DROP TABLE IF EXISTS test_table"
#define CREATE_SAMPLE_TABLE "CREATE TABLE test_table(col1 INT,\
                                                 col2 VARCHAR(40),\
                                                 col3 SMALLINT,\
                                                 col4 TIMESTAMP)"
#define INSERT_SAMPLE "INSERT INTO \
                       test_table(col1,col2,col3) \
                       VALUES(?,?,?)"

MYSQL_STMT    *stmt;
MYSQL_BIND    bind[3];
my_ulonglong  affected_rows;
int           param_count;
short         small_data;
int           int_data;
char          str_data[STRING_SIZE];
unsigned long str_length;
bool          is_null;

if (mysql_query(mysql, DROP_SAMPLE_TABLE))
{
  fprintf(stderr, " DROP TABLE failed\n");
  fprintf(stderr, " %s\n", mysql_error(mysql));
  exit(0);
}

if (mysql_query(mysql, CREATE_SAMPLE_TABLE))
{
  fprintf(stderr, " CREATE TABLE failed\n");
  fprintf(stderr, " %s\n", mysql_error(mysql));
  exit(0);
}

/* Prepare an INSERT query with 3 parameters */
/* (the TIMESTAMP column is not named; the server */
/*  sets it to the current date and time) */
stmt = mysql_stmt_init(mysql);
if (!stmt)
{
  fprintf(stderr, " mysql_stmt_init(), out of memory\n");
  exit(0);
}
if (mysql_stmt_prepare(stmt, INSERT_SAMPLE, strlen(INSERT_SAMPLE)))
{
  fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}
fprintf(stdout, " prepare, INSERT successful\n");

/* Get the parameter count from the statement */
param_count= mysql_stmt_param_count(stmt);
fprintf(stdout, " total parameters in INSERT: %d\n", param_count);

if (param_count != 3) /* validate parameter count */
{
  fprintf(stderr, " invalid parameter count returned by MySQL\n");
  exit(0);
}

/* Bind the data for all 3 parameters */

memset(bind, 0, sizeof(bind));

/* INTEGER PARAM */
/* This is a number type, so there is no need
   to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (char *)&int_data;
bind[0].is_null= 0;
bind[0].length= 0;

/* STRING PARAM */
bind[1].buffer_type= MYSQL_TYPE_STRING;
bind[1].buffer= (char *)str_data;
bind[1].buffer_length= STRING_SIZE;
bind[1].is_null= 0;
bind[1].length= &str_length;

/* SMALLINT PARAM */
bind[2].buffer_type= MYSQL_TYPE_SHORT;
bind[2].buffer= (char *)&small_data;
bind[2].is_null= &is_null;
bind[2].length= 0;

/* Bind the buffers */
if (mysql_stmt_bind_param(stmt, bind))
{
  fprintf(stderr, " mysql_stmt_bind_param() failed\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

/* Specify the data values for the first row */
int_data= 10;             /* integer */
strncpy(str_data, "MySQL", STRING_SIZE); /* string  */
str_length= strlen(str_data);

/* INSERT SMALLINT data as NULL */
is_null= 1;

/* Execute the INSERT statement - 1*/
if (mysql_stmt_execute(stmt))
{
  fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

/* Get the number of affected rows */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 1): %lu\n",
                (unsigned long) affected_rows);

if (affected_rows != 1) /* validate affected rows */
{
  fprintf(stderr, " invalid affected rows by MySQL\n");
  exit(0);
}

/* Specify data values for second row,
   then re-execute the statement */
int_data= 1000;
strncpy(str_data, "
        The most popular Open Source database",
        STRING_SIZE);
str_length= strlen(str_data);
small_data= 1000;         /* smallint */
is_null= 0;               /* reset */

/* Execute the INSERT statement - 2*/
if (mysql_stmt_execute(stmt))
{
  fprintf(stderr, " mysql_stmt_execute, 2 failed\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

/* Get the total rows affected */
affected_rows= mysql_stmt_affected_rows(stmt);
fprintf(stdout, " total affected rows(insert 2): %lu\n",
                (unsigned long) affected_rows);

if (affected_rows != 1) /* validate affected rows */
{
  fprintf(stderr, " invalid affected rows by MySQL\n");
  exit(0);
}

/* Close the statement */
if (mysql_stmt_close(stmt))
{
  /* mysql_stmt_close() invalidates stmt, so call          */
  /* mysql_error(mysql) rather than mysql_stmt_error(stmt) */
  fprintf(stderr, " failed while closing the statement\n");
  fprintf(stderr, " %s\n", mysql_error(mysql));
  exit(0);
}
笔记

在事先准备好的声明的使用功能的完整例子,参考文件tests/mysql_client_test.c。这个文件可以从MySQL源分布或从源库(见2.8节,从“源”安装MySQL

27.7.11.11 mysql_stmt_fetch()

int mysql_stmt_fetch(MYSQL_STMT *stmt)

描述

mysql_stmt_fetch()下一列的结果集返回。它可以被称为只有在结果集的存在;即,在调用mysql_stmt_execute()对于这样一个语句SELECT产生一个结果集

mysql_stmt_fetch()使用缓冲区的数据返回的行mysql_stmt_bind_result()。它返回的数据在缓冲区中当前行的所有列的长度设置和返回长度指针。所有列必须约束的应用程序之前,需要mysql_stmt_fetch()

默认情况下,结果把缓冲的一排服务器的时间。缓冲区设置在客户的整个结果,电话mysql_stmt_store_result()结合后的数据缓冲区,在调用mysql_stmt_fetch()

如果获取的数据值是一个NULL的价值,* is_null相应的价值MYSQL_BIND结构包含真实(1)。否则,数据和它的长度中返回*缓冲*length基于由应用程序指定的缓冲区类型的元素。每一个数字和时间的类型有固定的长度,如下表。该字符串的长度取决于实际的数据值的长度,如_日期长度

类型长度
MYSQL_TYPE_TINY
MYSQL_TYPE_SHORT
MYSQL_TYPE_LONG
MYSQL_TYPE_LONGLONG
MYSQL_TYPE_FLOAT
MYSQL_TYPE_DOUBLE
MYSQL_TYPE_TIMEsizeof(MYSQL_TIME)
MYSQL_TYPE_DATEsizeof(MYSQL_TIME)
MYSQL_TYPE_DATETIMEsizeof(MYSQL_TIME)
MYSQL_TYPE_STRINGdata length
MYSQL_TYPE_BLOBdata_length

在某些情况下,你可能想在取它确定一个列值的长度mysql_stmt_fetch()。例如,该值可能是一长串或BLOB值为你想知道多少空间必须分配。要做到这一点,你可以使用这些策略:

  • 调用前mysql_stmt_fetch()检索单个行,通stmt_attr_update_max_lengthmysql_stmt_attr_set(),然后调用mysql_stmt_store_result()缓冲整个结果在客户端。设置stmt_attr_update_max_length属性使列值的最大长度来表示的max_length结果集的成员返回的元数据mysql_stmt_result_metadata()

  • 援引mysql_stmt_fetch()对问题中的列和以实际长度可以存储10长度的缓冲区指针。然后用实际长度mysql_stmt_fetch_column()

    real_length= 0;bind[0].buffer= 0;bind[0].buffer_length= 0;bind[0].length= &real_lengthmysql_stmt_bind_result(stmt, bind);mysql_stmt_fetch(stmt);if (real_length > 0){  data= malloc(real_length);  bind[0].buffer= data;  bind[0].buffer_length= real_length;  mysql_stmt_fetch_column(stmt, bind, 0, 0);}
返回值
返回值描述
成功,数据已经读取应用数据缓冲区。
发生错误。错误代码和信息可以通过调用mysql_stmt_errno()mysql_stmt_error()
MYSQL_NO_DATA没有更多的行/数据存在
MYSQL_DATA_TRUNCATED发生数据截断

MYSQL_DATA_TRUNCATED返回时,截断报告启用。确定列值被截断时返回此值,检查错误的成员MYSQL_BIND用于读取值的结构。截断报告是默认启用的,但可以通过调用mysql_options()MySQL的_ _截断_报告日期选项

错误
例子

下面的示例演示如何获取数据从一个表使用mysql_stmt_result_metadata()mysql_stmt_bind_result(),和mysql_stmt_fetch()。(这个例子希望检索两排插的例子所示第27.7.11.10,“mysql_stmt_execute()”的。)mysql变量被认为是一个有效的连接处理。

#define STRING_SIZE 50#define SELECT_SAMPLE "SELECT col1, col2, col3, col4 \                       FROM test_table"MYSQL_STMT    *stmt;MYSQL_BIND    bind[4];MYSQL_RES     *prepare_meta_result;MYSQL_TIME    ts;unsigned long length[4];int           param_count, column_count, row_count;short         small_data;int           int_data;char          str_data[STRING_SIZE];bool          is_null[4];bool          error[4];/* Prepare a SELECT query to fetch data from test_table */stmt = mysql_stmt_init(mysql);if (!stmt){  fprintf(stderr, " mysql_stmt_init(), out of memory\n");  exit(0);}if (mysql_stmt_prepare(stmt, SELECT_SAMPLE, strlen(SELECT_SAMPLE))){  fprintf(stderr, " mysql_stmt_prepare(), SELECT failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}fprintf(stdout, " prepare, SELECT successful\n");/* Get the parameter count from the statement */param_count= mysql_stmt_param_count(stmt);fprintf(stdout, " total parameters in SELECT: %d\n", param_count);if (param_count != 0) /* validate parameter count */{  fprintf(stderr, " invalid parameter count returned by MySQL\n");  exit(0);}/* Fetch result set meta information */prepare_meta_result = mysql_stmt_result_metadata(stmt);if (!prepare_meta_result){  fprintf(stderr,         " mysql_stmt_result_metadata(), \           returned no meta information\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Get total columns in the query */column_count= mysql_num_fields(prepare_meta_result);fprintf(stdout,        " total columns in SELECT statement: %d\n",        column_count);if (column_count != 4) /* validate column count */{  fprintf(stderr, " invalid column count returned by MySQL\n");  exit(0);}/* Execute the SELECT query */if (mysql_stmt_execute(stmt)){  fprintf(stderr, " mysql_stmt_execute(), failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Bind the result buffers for all 4 columns before fetching them */memset(bind, 0, sizeof(bind));/* INTEGER COLUMN */bind[0].buffer_type= MYSQL_TYPE_LONG;bind[0].buffer= (char *)&int_data;bind[0].is_null= &is_null[0];bind[0].length= &length[0];bind[0].error= &error[0];/* STRING COLUMN */bind[1].buffer_type= MYSQL_TYPE_STRING;bind[1].buffer= (char *)str_data;bind[1].buffer_length= STRING_SIZE;bind[1].is_null= &is_null[1];bind[1].length= &length[1];bind[1].error= &error[1];/* SMALLINT COLUMN */bind[2].buffer_type= MYSQL_TYPE_SHORT;bind[2].buffer= (char *)&small_data;bind[2].is_null= &is_null[2];bind[2].length= &length[2];bind[2].error= &error[2];/* TIMESTAMP COLUMN */bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP;bind[3].buffer= (char *)&ts;bind[3].is_null= &is_null[3];bind[3].length= &length[3];bind[3].error= &error[3];/* Bind the result buffers */if (mysql_stmt_bind_result(stmt, bind)){  fprintf(stderr, " mysql_stmt_bind_result() failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Now buffer all results to client (optional step) */if (mysql_stmt_store_result(stmt)){  fprintf(stderr, " mysql_stmt_store_result() failed\n");  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));  exit(0);}/* Fetch all rows */row_count= 0;fprintf(stdout, "Fetching results ...\n");while (!mysql_stmt_fetch(stmt)){  row_count++;  fprintf(stdout, "  row %d\n", row_count);  /* column 1 */  fprintf(stdout, "   column1 (integer)  : ");  if (is_null[0])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %d(%ld)\n", int_data, length[0]);  /* column 2 */  fprintf(stdout, "   column2 (string)   : ");  if (is_null[1])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %s(%ld)\n", str_data, length[1]);  /* column 3 */  fprintf(stdout, "   column3 (smallint) : ");  if (is_null[2])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %d(%ld)\n", small_data, length[2]);  /* column 4 */  fprintf(stdout, "   column4 (timestamp): ");  if (is_null[3])    fprintf(stdout, " NULL\n");  else    fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n",                     ts.year, ts.month, ts.day,                     ts.hour, ts.minute, ts.second,                     length[3]);  fprintf(stdout, "\n");}/* Validate rows fetched */fprintf(stdout, " total rows fetched: %d\n", row_count);if (row_count != 2){  fprintf(stderr, " MySQL failed to return all rows\n");  exit(0);}/* Free the prepared result metadata */mysql_free_result(prepare_meta_result);/* Close the statement */if (mysql_stmt_close(stmt)){  /* mysql_stmt_close() invalidates stmt, so call          */  /* mysql_error(mysql) rather than mysql_stmt_error(stmt) */  fprintf(stderr, " failed while closing the statement\n");  fprintf(stderr, " %s\n", mysql_error(mysql));  exit(0);}

27.7.11.12 mysql_stmt_fetch_column()

int mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, unsigned int column, unsigned long offset)

描述

取一列从当前结果集行。bind提供缓冲,数据应放。应当建立同mysql_stmt_bind_result()专栏表明取哪一列。第一列是编号0。offset是在这偏移数据值开始检索数据。这可以用于获取数据块。的价值开始偏移0。

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.11.13 MySQL支撑_ _场_ count()

unsigned int mysql_stmt_field_count(MYSQL_STMT *stmt)

描述

返回该语句的处理程序的最新声明中的列数。该值是诸如零INSERTDELETE不产生结果集

mysql_stmt_field_count()可当你通过调用准备发表声明称mysql_stmt_prepare()

返回值

一个无符号整数表示结果的列数集。

错误

27.7.11.14 mysql_stmt_free_result()

bool mysql_stmt_free_result(MYSQL_STMT *stmt)

描述

对所制备的语句执行生产集释放内存的结果相关。如果有一个光标的公开声明,mysql_stmt_free_result()关闭它

返回值

零成功。非零,如果发生了一个错误。

27.7.11.15 mysql_stmt_init()

MYSQL_STMT *mysql_stmt_init(MYSQL *mysql)

描述

创建并返回一个MYSQL_STMT处理程序。处理程序应该释放mysql_stmt_close(),此时处理无效,应不再使用。

参见第27.7.9,“C API编写报表数据结构”为更多的信息

返回值

一个指向函数的指针MYSQL_STMT房屋结构在大学的成功。无效的如果失去记忆

错误

27.7.11.16 MySQL _ stmt _ _ ID(插入)

my_ulonglong mysql_stmt_insert_id(MYSQL_STMT *stmt)

描述

返回一个值的产生AUTO_INCREMENT通过制备柱INSERTUPDATE声明。使用此功能在您执行的准备INSERT声明一个表包含一个汽车

看到第27.7.7.38,“mysql_insert_id()”为更多的信息

返回值

价值AUTO_INCREMENT这是自动生成的列或声明的执行过程中显式设置,或价值产生的LAST_INSERT_ID(expr)功能。如果语句不设置返回值是未定义的汽车价值

错误

27.7.11.17 mysql_stmt_next_result()

int mysql_stmt_next_result(MYSQL_STMT *mysql)

描述

使用此功能,当你使用准备CALL语句执行存储过程,可以返回多个结果集。使用循环调用mysql_stmt_next_result()以确定是否有更多的结果。如果一个程序INOUT参数,其值将作为一个单一的行的结果集以下任何返回的结果集。的值将出现在其程序中的参数列表中声明的次序。

mysql_stmt_next_result()返回一个状态指示是否存在更多的结果。如果mysql_stmt_next_result()返回一个错误,没有结果。

在每次调用mysql_stmt_next_result(),你必须调用mysql_stmt_free_result()对于目前的结果,如果它产生的结果集(而不仅仅是一个结果状态)。

在调用mysql_stmt_next_result()连接的状态,如果你叫了mysql_stmt_execute()。这意味着你可以打电话mysql_stmt_bind_result()mysql_stmt_affected_rows()我知道,和等等

它也可以检测是否有更多的结果,通过调用mysql_more_results()。然而,这个函数不改变连接状态,所以如果它返回true,你仍然必须调用mysql_stmt_next_result()前进到下一个结果

为例,说明如何使用mysql_stmt_next_result(),看到第27.7.21,“C API编写的调用语句的支持”

返回值
返回值描述
成功的和有更多的结果
- 1成功并没有更多的结果
&#62; 0发生了一个错误
错误

27.7.11.18 mysql num rows(_ stmt _ _)

my_ulonglong mysql_stmt_num_rows(MYSQL_STMT *stmt)

描述

返回结果集的行数

使用mysql_stmt_num_rows()对你曾经使用过的mysql_stmt_store_result()缓冲区设置在报表处理整个结果。如果你使用mysql_stmt_store_result()mysql_stmt_num_rows()可以立即调用。否则,行计数不可用,除非你算你取行。

mysql_stmt_num_rows()目的是为使用语句返回结果集,如SELECT。对于这样的语句INSERTUPDATE,或DELETE,受影响的行数可以获得mysql_stmt_affected_rows()

返回值

在结果集的行数

错误

27.7.11.19 MySQL _ stmt _ _ count()参数

unsigned long mysql_stmt_param_count(MYSQL_STMT *stmt)

描述

返回参数标记在声明中出现的数量。

返回值

一个无符号长整数代表在一份声明中参数的数目。

错误

27.7.11.20 MySQL _ stmt _ _元数据(参数)

MYSQL_RES *mysql_stmt_param_metadata(MYSQL_STMT *stmt)

此功能目前没有任何

为准备27.7.11.21 _ _(MySQL)

int mysql_stmt_prepare(MYSQL_STMT *stmt, const char *stmt_str, unsigned long length)

描述

鉴于报表处理程序返回的mysql_stmt_init(),准备SQL语句所指向的字符串请_ STR并返回一个状态值。字符串的长度要由length争论。该字符串必须包含一个单独的SQL语句。你不应该加一个分号(终止)或\g的声明

应用程序可以包含一个或多个嵌入的问号在SQL语句中的参数标记(?)字符转换为SQL字符串在适当的位置。

标记只在SQL语句中的某些地方是合法的。例如,他们被允许在VALUES()列表中的一个INSERT声明(指定一列列的值),或在一个柱的比较哪里子句指定一个比较值。然而,他们是不被允许的标识符(如表或列的名称),或指定一个二进制运算符如两个数=等号。后者的限制是必要的因为它是不可能确定的参数类型。在一般情况下,参数仅在数据操作语言(DML)语句是合法的,而不是在数据定义语言(DDL)语句。

参数标记必须绑定到应用程序变量的使用mysql_stmt_bind_param()在执行该语句

元数据更改表或视图被准备语句检测导致语句自动复配时,下一个执行。有关更多信息,参见8.10.3节,“缓存的准备好的语句和存储的程序”

返回值

零成功。非零,如果发生了一个错误。

错误

如果准备操作失败(即,mysql_stmt_prepare()返回非零值),错误信息可以通过调用mysql_stmt_error()

27.7.11.22 MySQL支撑_ _(复位)

bool mysql_stmt_reset(MYSQL_STMT *stmt)

描述

将事先准备好的声明对客户机和服务器状态后准备。它将服务器上的报表,数据发送使用mysql_stmt_send_long_data(),无缓冲的结果集和电流误差。它没有明确的绑定或存储结果集。存储结果集将被执行的语句编写时(或关闭)。

重新准备另一个查询语句,使用mysql_stmt_prepare()

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.11.23 mysql_stmt_result_metadata()

MYSQL_RES *mysql_stmt_result_metadata(MYSQL_STMT *stmt)

描述

如果一个语句传递给mysql_stmt_prepare()是一个能产生一个结果集,mysql_stmt_result_metadata()返回一个指针的形式对结果集元数据MySQL是_结构可用于过程的元信息等领域和个人领域的信息数。这一结果集指针可以作为任何领域的基于API函数,过程结果集元数据通过,如:

结果集的结构应该被释放,当你完成它,你可以通过它mysql_free_result()。这种方式类似于你自由的结果集从一个电话了mysql_store_result()

返回的结果集mysql_stmt_result_metadata()只包含元数据。它不包含任何行的结果。利用报表处理程序得到的行mysql_stmt_fetch()

返回值

MYSQL_RES结果结构无效的如果准备不存在的元信息查询。

错误

27.7.11.24 MySQL _ stmt _行_ seek()

MYSQL_ROW_OFFSET mysql_stmt_row_seek(MYSQL_STMT *stmt, MYSQL_ROW_OFFSET offset)

描述

设置任意排在结果集的行指针声明。这个offset价值是一个行偏移,应返回值mysql_stmt_row_tell()或从mysql_stmt_row_seek()。这个值不是一个行数;如果你想寻求一个排在结果集的数量,使用mysql_stmt_data_seek()相反

此功能需要的结果集的结构包含查询的整个结果,所以mysql_stmt_row_seek()仅可用于结合mysql_stmt_store_result()

返回值

该行的光标的前一个值。这个值可以通过后续的电话mysql_stmt_row_seek()

错误

27.7.11.25 MySQL _ stmt _ _(行)。

MYSQL_ROW_OFFSET mysql_stmt_row_tell(MYSQL_STMT *stmt)

描述

返回最后一行光标的当前位置mysql_stmt_fetch()。这个值可以被用来作为一个参数mysql_stmt_row_seek()

你应该使用mysql_stmt_row_tell()只有在mysql_stmt_store_result()

返回值

该行的游标的当前偏移。

错误

27.7.11.26 MySQL _为_ send _长_(数据)

bool mysql_stmt_send_long_data(MYSQL_STMT *stmt, unsigned int parameter_number, const char *data, unsigned long length)

描述

使应用程序发送参数数据块服务器(或)。调用此函数后,mysql_stmt_bind_param()和之前mysql_stmt_execute()。可以多次调用发送一个字符或二进制数据值的列的部分,它必须是一个的TEXTBLOB数据类型

parameter_number表明将数据与参数。参数编号从0开始。数据是一个指向一个缓冲区包含要发送的数据,并length显示缓冲区中的字节数。

笔记

下一个mysql_stmt_execute()打电话给忽略了缓冲液的所有参数,采用了mysql_stmt_send_long_data()自去年mysql_stmt_execute()mysql_stmt_reset()

如果你想复位/忘记发送的数据,你可以这样做mysql_stmt_reset()。看到第27.7.11.22,“mysql_stmt_reset()”

这个max_allowed_packet系统变量的控制,可以发送的最大参数值的大小mysql_stmt_send_long_data()

返回值

零成功。非零,如果发生了一个错误。

错误
例子

下面的示例演示如何将数据发送给TEXT列块。它插入的数据值“MySQL最流行的开源数据库进入text_column专栏这个MySQL变量被认为是一个有效的连接处理。

#define INSERT_QUERY "INSERT INTO \
                      test_long_data(text_column) VALUES(?)"

MYSQL_BIND bind[1];
long       length;

stmt = mysql_stmt_init(mysql);
if (!stmt)
{
  fprintf(stderr, " mysql_stmt_init(), out of memory\n");
  exit(0);
}
if (mysql_stmt_prepare(stmt, INSERT_QUERY, strlen(INSERT_QUERY)))
{
  fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed");
  fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
  exit(0);
}
 memset(bind, 0, sizeof(bind));
 bind[0].buffer_type= MYSQL_TYPE_STRING;
 bind[0].length= &length;
 bind[0].is_null= 0;

/* Bind the buffers */
if (mysql_stmt_bind_param(stmt, bind))
{
  fprintf(stderr, "\n param bind failed");
  fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
  exit(0);
}

 /* Supply data in chunks to server */
 if (mysql_stmt_send_long_data(stmt,0,"MySQL",5))
{
  fprintf(stderr, "\n send_long_data failed");
  fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
  exit(0);
}

 /* Supply the next piece of data */
 if (mysql_stmt_send_long_data(stmt,0,
           " - The most popular Open Source database",40))
{
  fprintf(stderr, "\n send_long_data failed");
  fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
  exit(0);
}

 /* Now, execute the query */
 if (mysql_stmt_execute(stmt))
{
  fprintf(stderr, "\n mysql_stmt_execute failed");
  fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
  exit(0);
}

27.7.11.27 _ stmt _ SQLSTATE(MySQL)

const char *mysql_stmt_sqlstate(MYSQL_STMT *stmt)

描述

指定的声明stmtmysql_stmt_sqlstate()返回一个空字符串包含SQLSTATE错误代码为最近调用事先准备好的声明API函数,可以成功或失败。错误代码由五个字符。“00000”方法没有错误该值是由ANSI SQL和ODBC的指定。一个可能值的列表,参见附录B,错误,错误代码,及常见问题

不是所有的MySQL错误映射到SQLSTATE代码。的价值"HY000"(一般误差)用于映射的错误。

如果没有声明API函数mysql_stmt_close(),不叫mysql_stmt_sqlstate()获取错误信息的原因mysql_stmt_close()使语句句柄无效。呼叫mysql_sqlstate()相反

返回值

一个空终止字符串包含SQLSTATE错误代码。

27.7.11.28 mysql_stmt_store_result()

int mysql_stmt_store_result(MYSQL_STMT *stmt)

描述

结果集是由调用mysql_stmt_execute()要执行的语句编写的SQL语句,如SELECTSHOWDESCRIBE,和EXPLAIN。默认情况下,结果集的成功执行准备好的语句不缓存在客户端和mysql_stmt_fetch()取其中的一个服务器的时间。使完整的结果集被缓存在客户端,调用mysql_stmt_store_result()结合后的数据缓冲区mysql_stmt_bind_result()和之前调用mysql_stmt_fetch()取行。(例如,见第27.7.11.11,“mysql_stmt_fetch()”。)

mysql_stmt_store_result()对于结果集的处理选项,除非你会打电话mysql_stmt_data_seek()mysql_stmt_row_seek(),或mysql_stmt_row_tell()。这些功能需要一个可搜索的结果集。

这是不必要的电话mysql_stmt_store_result()执行一个SQL语句,不会产生一个结果集后,但如果你这样做,它不会伤害或造成任何明显的性能问题。你可以检测是否语句生成的结果集的检查mysql_stmt_result_metadata()退货无效的。有关更多信息,参见第27.7.11.23,“mysql_stmt_result_metadata()”

笔记

MySQL默认不计算MYSQL_FIELD->max_length所有列mysql_stmt_store_result()因为计算这将减缓mysql_stmt_store_result()相当大部分的应用都不需要max_length。如果你想max_length要更新,你可以打电话mysql_stmt_attr_set(MYSQL_STMT, STMT_ATTR_UPDATE_MAX_LENGTH, &flag)为了使这。看到第27.7.11.3,“mysql_stmt_attr_set()”

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.12 C API螺纹功能描述

创建一个线程的客户端,使用在下面的章节中描述的功能。参见第27.7.4.3,”写的C API螺纹客户端程序”

27.7.12.1 mysql_thread_end()

void mysql_thread_end(void)

描述

在调用之前调用这个函数pthread_exit()免费分配内存mysql_thread_init()

mysql_thread_end()是不是自动的客户端库调用

返回值

27.7.12.2 mysql_thread_init()

bool mysql_thread_init(void)

描述

这个函数必须在创建的每个线程初始化线程特定变量的早期。然而,你可能不一定需要调用它明确:打电话mysql_thread_init()自动处理mysql_init()mysql_library_init()mysql_server_init(),和mysql_connect()。如果你调用那些函数,mysql_thread_init()叫你

返回值

零成功。非零,如果发生了一个错误。

27.7.12.3 mysql_thread_safe()

unsigned int mysql_thread_safe(void)

描述

这个函数指示客户端库编写线程安全的。

返回值

1如果客户端库是线程安全的,否则为0。

27.7.13 C API函数的客户端插件

本节为客户端和插件所用的功能。他们的客户管理插件。for a description of thest_mysql_client_plugin通过使用这些功能结构,看第28.2.4.2.3,“客户端插件描述符”

这是不可能的一个客户端程序需要在这段通话功能。例如,一个支持的身份验证插件的正常使用造成的插件是通过调用客户端mysql_options()设置_ _ auth mysql默认MYSQL_PLUGIN_DIR选项:

char *plugin_dir = "path_to_plugin_dir";char *default_auth = "plugin_name“;/*…过程命令行选项。* / MySQL(MySQL和MySQL _选项,你_ _插件插件,你_);_ options(MySQL和MySQL,MySQL _ _ AUTH的违约,违约_ auth);

通常情况下,该计划还将接受--plugin-dir-默认的认证这使用户能够覆盖默认值选项。

27.7.13.1 MySQL客户端插件_ _ _(find)

struct st_mysql_client_plugin *mysql_client_find_plugin(MYSQL *mysql, const char *name, int type)

描述

返回一个指向一个插件加载,加载插件,如果需要的话。发生错误,如果类型无效或无法找到或加载的插件。

指定的参数如下:

  • mysql:一个指向MySQL结构。插件API不需要连接到MySQL服务器,但这种结构必须正确初始化。结构是用来获取连接的相关信息。

  • name插件:the name。

  • typeThe lujer Type .

返回值

一个指向插件成功NULL如果发生了一个错误

例子
MYSQL mysql;
struct st_mysql_client_plugin *p;

if ((p = mysql_client_find_plugin(&mysql, "myplugin",
                                  MYSQL_CLIENT_AUTHENTICATION_PLUGIN, 0)))
{
  printf("Plugin version: %d.%d.%d\n", p->version[0], p->version[1], p->version[2]);
}

27.7.13.2 MySQL客户端注册_ _ _(插件)

struct st_mysql_client_plugin *mysql_client_register_plugin(MYSQL *mysql, struct st_mysql_client_plugin *plugin)

描述

添加一个插件结构加载插件列表。如果插件已经加载时发生错误。

指定的参数如下:

  • mysql:一个指向MySQL结构。插件API不需要连接到MySQL服务器,但这种结构必须正确初始化。结构是用来获取连接的相关信息。

  • plugin:一个指向插件结构

返回值

一个指向插件成功NULL如果发生了一个错误

27.7.13.3 mysql_load_plugin()

struct st_mysql_client_plugin *mysql_load_plugin(MYSQL *mysql, const char *name, int type, int argc, ...)

描述

加载一个MySQL客户端插件的名字和类型说明。如果类型无效或无法加载的插件出现错误。

这是不可能的负载相同类型的多个插件。如果你尝试加载插件的类型已经加载时发生错误。

指定的参数如下:

  • mysql:一个指向MySQL结构。插件API不需要连接到MySQL服务器,但这种结构必须正确初始化。结构是用来获取连接的相关信息。

  • name:加载插件的名称

  • type:加载插件的类型,或?1禁用类型检查。如果类型不?1,只有插件匹配型被认为是加载。

  • argc以下参数:数量(0如果是没有的)。任何以下参数的解释取决于插件式。

另一种方式来引起插件被加载设置LIBMYSQL_PLUGINS环境变量以分号分隔的插件名称列表。例如:

shell> export LIBMYSQL_PLUGINS="myplugin1;myplugin2"

插件命名LIBMYSQL_PLUGINS加载时,客户端程序调用mysql_library_init()。没有错误的报道如果出现问题,加载这些插件。

这个LIBMYSQL_PLUGIN_DIR环境变量可以被设置为在该目录的路径名查找客户端插件。这个变量的使用方法有两种:

  • 客户端插件加载时,值了--plugin-dir选项是不可用的,所以客户端插件加载失败除非插件位于固有的默认目录。如果插件位于其他地方,libmysql _ _插件目录环境变量可以被设置到适当的目录启用插件加载成功。

  • 明确的客户端插件的加载,mysql_load_plugin()mysql_load_plugin_v()C API函数使用libmysql _ _插件目录如果它存在的价值--plugin-dir选择了。如果- Plujing - dir .给出了,mysql_load_plugin()mysql_load_plugin_v()忽略libmysql _ _插件目录

返回值

一个指向插件是否成功加载。NULL如果发生了一个错误

例子
MYSQL mysql;

if(!mysql_load_plugin(&mysql, "myplugin",
                      MYSQL_CLIENT_AUTHENTICATION_PLUGIN, 0))
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
    exit(-1);
}

27.7.13.4 mysql_load_plugin_v()

struct st_mysql_client_plugin *mysql_load_plugin_v(MYSQL *mysql, const char *name, int type, int argc, va_list args)

描述

这个函数是等价的mysql_load_plugin(),但它接受你_听.而不是一个可变参数列表。

27.7.13.5 MySQL _ _ options(插件)

int mysql_plugin_options(struct st_mysql_client_plugin *plugin, const char *option, const void *value)

描述

通过选择类型和值的一个插件。这个函数可以多次调用设置几个选项。如果插件没有选择处理程序,发生了一个错误。

指定的参数如下:

  • plugin:一个指向插件结构

  • option:选择定

  • value:一个指针的期权价值。

返回值

零成功,1如果出现了一个错误。如果插件有一个选项,处理器,处理器也要换取成功和1 0如果发生错误。

27.7.14 C API接口的二进制日志

MySQL客户端/服务器协议包括用于读取从一个MySQL服务器的二进制日志流的复制事件的客户端界面。此功能使用MYSQL_RPL数据结构和一系列的功能来管理通信的客户端程序,服务器上的二进制日志是读。以下各节描述更详细的这方面的接口。

27.7.15 C API的二进制日志中的数据结构

C API函数用于处理复制事件流从服务器需要连接句柄(一MYSQL *指针)和一个指向MySQL _ RPL结构描述复制事件的蒸汽从服务器读取二进制日志。例如:

MYSQL *mysql = mysql_real_connect(...);

MYSQL_RPL rpl;

# ... initialize MYSQL_RPL members ...

int result = mysql_binlog_open(mysql, &rpl);

本节描述MYSQL_RPL结构成员。连接处理器的描述第27.7.5,“C API的数据结构”

适用MYSQL_RPL成员依赖于二进制日志中要执行的操作:

  • 在调用mysql_binlog_open(),调用者必须设置MySQL _ RPL成员file_name_length通过旗帜。此外,如果flagsMySQL _ RPL _ gtid旗标,调用者必须设置成员gtid_set_encoded_size通过gtid _看到_精氨酸

  • 成功后mysql_binlog_fetch()打电话,打电话的人检查大小buffer会员

MYSQL_RPL结构构件的描述:

  • file_name_length

    读取的二进制日志文件名称长度。这件配合使用file_name;看file_name描述

  • file_name

    读取二进制日志文件的名称:

    • 如果file_name无效的,客户端库设置为空字符串和集file_name_length这是0

    • 如果file_name是不是无效的file_name_length必须是0名或长度。如果file_name_length0、客户端库设置其名称的长度,在这种情况下,file_name必须给出一个null结尾的字符串。

    从二进制日志的开头不知道最古老的二进制日志文件名读取,设置file_name无效的或空字符串,和start_position4

  • start_position

    在该位置开始读取二进制日志。在任何给定的二进制日志文件的第一个事件的位置是4。

  • server_id

    服务器ID用于标识服务器上的二进制日志读取。

  • flags

    对影响二进制日志阅读标志的联盟,或0如果未设置任何标志。这些标志值是允许的:

    • MYSQL_RPL_SKIP_HEARTBEAT

      这个标志的原因mysql_binlog_fetch()跳过心跳事件

    • MYSQL_RPL_GTID

      设置此标志读gtid(全局事务ID)数据。如果设置,你必须初始化MYSQL_RPL结构gtid相关成员gtid_set_encoded_sizegtid_set_arg在调用mysql_binlog_open()

      这超出了本文档的范围,详细描述了如何使用这些gtid相关成员的客户端程序。更多信息,查看mysqlbinlog.cc源文件。关于gtid基于复制的信息,参见部分下面,“复制与全球事务标识符”

  • gtid_set_encoded_size

    《大学gtid尺寸上的数据,或0。

  • fix_gtid_set

    对于一个回调函数的地址mysql_binlog_open()叫填充命令包gtid集,或无效的如果没有这样的功能。回调函数,如果使用,应该有这个电话签名:

    void my_callback(MYSQL_RPL *rpl, unsigned char *packet_gtid_set);
    
  • gtid_set_arg

    一个指针gtid集数据(如果fix_gtid_set无效的),或一个指向可以在回调函数中使用的值(如果fix_gtid_set是不是无效的gtid_set_arg是一个通用的指针,它可以指向任何类型的值(例如,一个字符串,一个结构或功能)。其在回调的解释取决于回调打算用它。

  • size

    成功后mysql_binlog_fetch()调用,返回的二进制日志事件的大小。该值是0个EOF事件,大于0为非EOF事件。

  • buffer

    成功后mysql_binlog_fetch()电话,一个指针的二进制日志事件内容。

27.7.16 C API的二进制日志功能概述

下表总结了功能可以从二进制日志读取复制事件流。为更详细的描述,参见第27.7.17,”C API的二进制日志功能描述”

功能描述
mysql_binlog_close()关闭复制事件流
mysql_binlog_fetch()读取复制事件流事件
mysql_binlog_open()打开复制事件流

27.7.17 C API的二进制日志功能描述

以下各节提供,使从一个MySQL服务器的二进制日志读取复制的事件流功能的详细描述。

下面的简单示例程序演示了二进制日志C API函数。程序注释:

  • mysql被认为是一个有效的连接处理。

  • 最初的SET语句集binlog @主_ _校验用户定义的变量,服务器作为一个迹象表明,客户端校验和感知。这个客户不校验,但是没有这句话,一个服务器,包括二进制校验和日志事件会返回一个错误读取事件包含一个校验和的第一次尝试。赋给变量的值是不重要的;重要的是变量的存在。存在。

if (mysql_query(mysql, "SET @master_binlog_checksum='ALL'"))
{
  fprintf(stderr, "mysql_query() failed\n");
  fprintf(stderr, "Error %u: %s\n",
           mysql_errno(mysql), mysql_error(mysql));
  exit(1);
}

MYSQL_RPL rpl;

rpl.file_name_length = 0;
rpl.file_name = NULL;
rpl.start_position = 4;
rpl.server_id = 0;
rpl.flags = 0;

if (mysql_binlog_open(mysql, &rpl))
{
  fprintf(stderr, "mysql_binlog_open() failed\n");
  fprintf(stderr, "Error %u: %s\n",
           mysql_errno(mysql), mysql_error(mysql));
  exit(1);
}
for (;;)  /* read events until error or EOF */
{
  if (mysql_binlog_fetch(mysql, &rpl))
  {
    fprintf(stderr, "mysql_binlog_fetch() failed\n");
    fprintf(stderr, "Error %u: %s\n",
             mysql_errno(mysql), mysql_error(mysql));
    break;
  }
  if (rpl.size == 0)  /* EOF */
  {
    fprintf(stderr, "EOF event received\n");
    break;
  }
  fprintf(stderr, "Event received of size %lu.\n", rpl.size);
}
mysql_binlog_close(mysql, &rpl);

额外的例子,展示了如何使用这些功能,看看在这些源文件MySQL源分布:

  • mysqlbinlog.cc客户目录

  • mysql_client_test.ctestclients目录

27.7.17.1 mysql_binlog_close()

void mysql_binlog_close(MYSQL *mysql, MYSQL_RPL *rpl)

描述

关闭复制事件流

争论:

错误

27.7.17.2 mysql_binlog_fetch()

int mysql_binlog_fetch(MYSQL *mysql, MYSQL_RPL *rpl)

描述

从复制事件流取一个事件。

争论:

  • mysql:连接句柄返回mysql_init()

  • rpl:复制流结构。一个成功的电话后,大小成员表示事件的大小,这是0个EOF事件。对于一个非EOF事件,size大于零,缓冲区会员积分的活动内容

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.17.3 mysql_binlog_open()

int mysql_binlog_open(MYSQL *mysql, MYSQL_RPL *rpl)

描述

打开一个新的复制事件流,读一个MySQL服务器的二进制日志。

争论:

返回值

零成功。非零,如果发生了一个错误。

错误

27.7.18 C API加密连接支持

本节介绍了如何使用C程序的C API功能的加密连接。默认情况下,MySQL程序试图连接使用加密如果服务器支持加密连接,返回到未加密的连接如果加密连接无法建立(见第6.4.1配置MySQL,使用加密的连接”)。应用程序需要控制超出了默认行为如何加密的连接被建立,C API提供了这些能力:

选项C API加密连接

mysql_options()提供以下超过使用加密连接控制选项。选项的详细信息,参见第27.7.7.50,“mysql_options()”

  • MYSQL_OPT_SSL_CA:证书的权威证书文件的路径名(CA)。这个选项,如果使用,必须指定的服务器使用相同的证书。

  • MYSQL_OPT_SSL_CAPATH:包含受信任的SSL证书的CA文件的目录的路径名。

  • MYSQL_OPT_SSL_CERT:客户的公钥证书的文件的路径名。

  • MYSQL_OPT_SSL_CIPHER:允许SSL加密的密码列表。

  • MYSQL_OPT_SSL_CRL:含证书吊销列表的文件的路径名。

  • MYSQL_OPT_SSL_CRLPATH证书吊销列表:包含文件的目录的路径名。

  • MYSQL_OPT_SSL_KEY路径名:《客户的私人密钥文件。

  • MYSQL_OPT_SSL_MODE安全:the connection)。

  • MYSQL_OPT_TLS_VERSION:加密协议允许客户端。

mysql_ssl_set()可以作为一个方便的程序,相当于一套mysql_options()调用指定的证书和密钥文件,加密密码,等等。看到第27.7.7.77,MySQL _ _集(SSL)”

执行加密连接

mysql_options()信息,如SSL证书和密钥文件选项用于如连接可建立加密连接,但不执行任何要求得到的连接是加密的。需要加密连接,使用以下技术:

  1. 呼叫mysql_options()必要时提供恰当的参数(SSL证书和密钥文件,加密密码,等等)。

  2. 呼叫mysql_options()通过mysql_opt_ssl_mode一个期权价值SSL_MODE_REQUIRED或者更严格的期权价值。

  3. 呼叫mysql_real_connect()连接到服务器。如果加密连接无法获得呼叫失败;一个错误退出。

提高加密连接安全

对于额外的安全性相对于默认的加密设置,客户端可以提供一个CA证书匹配的一个服务器使用的身份验证,使主机名。在这种方式中,服务器和客户端在同一个地方他们信任的CA证书和客户端验证的主机,它连接的是一个打算:

  • 指定的CA证书,电话mysql_options()通过八_ SSL _ MySQL作为_(或MYSQL_OPT_SSL_CAPATH)选项,并调用mysql_options()通过mysql_opt_ssl_mode一个期权价值SSL_MODE_VERIFY_CA

  • 使主机名的身份验证以及电话mysql_options()通过mysql_opt_ssl_mode一个期权价值SSL_MODE_VERIFY_IDENTITY而不是ssl_mode_verify_ca

笔记

主机名的身份验证不使用自签名证书由服务器自动创建工作,或手动使用mysql_ssl_rsa_setup(见第6.4.3.1,“创建SSL和RSA证书和使用MySQL”键)。这样的自签名证书不包含服务器名称为通用名称的价值。

27.7.19 C API多语句执行支持

默认情况下,mysql_query()mysql_real_query()解读其声明字符串参数作为一个单一的语句,你的结果是根据语句的结果集(行集,作为SELECT)或受影响的行数(例如INSERTUPDATE我知道,和四)

MySQL还支持一个包含多个语句用分号分开执行(;)字符。这种能力是通过被指定当你连接到服务器的特殊选项mysql_real_connect()或连接后通过调用mysql_set_server_option()

执行多个语句的字符串可以生成多个结果集或行数指标。处理结果要比为单个语句的情况下一种不同的方法:从第一个语句处理的结果,要检查是否存在更多的结果和过程他们反过来如果。支持多个结果的处理,C API包括mysql_more_results()mysql_next_result()功能.这些函数用于在一个循环迭代,只要更多的结果是可用的。没有过程的结果可能会导致下降到服务器的连接。

多个结果的处理也是如果执行要求CALL存储过程的语句。从存储过程的结果有以下特点:

  • 在过程声明可能产生的结果集(例如,如果它执行SELECT语句)。这些结果集返回的顺序,他们生产的程序执行。

    一般来说,打电话的人不知道有多少个程序将返回的结果集。程序的执行可能取决于循环或条件语句,导致执行路径与一个叫下一个。因此,你必须准备检索多个结果。

  • 从程序的最终结果是一种身份的结果,不包括结果集。状态指示程序是否成功或发生错误。

多个语句和结果的能力,只能用于mysql_query()mysql_real_query()。他们不能用事先准备好的声明接口。语句编写处理程序定义只包含单个语句字符串。看到第27.7.8,“C API编写的语句”

使多个语句执行和结果的处理,下列选项可用:

  • 这个mysql_real_connect()功能有旗帜的说法,两个选项的值是相关的:

    • CLIENT_MULTI_RESULTS使客户端程序处理多个结果。这个选项必须如果你执行启用CALL对于存储产生的结果集的程序语句。否则,这样的程序导致的错误错误1312(0a000):程序proc_name不返回结果集在给定的上下文client_multi_results默认情况下启用

    • CLIENT_MULTI_STATEMENTS使能够mysql_query()mysql_real_query()执行语句字符串包含多个语句用分号分隔。这个选项也可以client_multi_results含蓄,所以flags争论多客户端_ _声明mysql_real_connect()相当于一个论点client_multi_statements | client_multi_results。这是,CLIENT_MULTI_STATEMENTS足以使多个语句执行和多结果的处理。

  • 在与服务器的连接已建立,您可以使用mysql_set_server_option()功能启用或通过参数控制多个语句执行选择一个多方面的选择MYSQL_OPTION_MULTI_STATEMENTS_OFF。使这个功能多语句执行也使加工简约对于多语句字符串中的每个语句产生一个结果,但足够存储产生的结果集的程序处理。

下面的过程概述了建议的策略处理多个报表:

  1. 通过CLIENT_MULTI_STATEMENTSmysql_real_connect(),全面启用多个语句执行和多结果的处理。

  2. 在调用mysql_query()mysql_real_query()并验证成功,进入一个循环内,你处理语句的结果。

  3. 每个循环迭代中,处理当前语句的结果,无论是检索结果集或受影响的行数。如果出现错误,退出循环。

  4. 循环结束时,调用mysql_next_result()检查是否存在另一个结果,若因此引发检索。如果没有结果的情况下,退出循环。

上述策略的一个可能的实现如下。在循环的最后一部分可以归结为是一个简单的测试mysql_next_result()返回非零值。代码写的区分不再结果之间的误差,使信息被打印为后者的发生。

/* connect to server with the CLIENT_MULTI_STATEMENTS option */if (mysql_real_connect (mysql, host_name, user_name, password,    db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS) == NULL){  printf("mysql_real_connect() failed\n");  mysql_close(mysql);  exit(1);}/* execute multiple statements */status = mysql_query(mysql,                     "DROP TABLE IF EXISTS test_table;\                      CREATE TABLE test_table(id INT);\                      INSERT INTO test_table VALUES(10);\                      UPDATE test_table SET id=20 WHERE id=10;\                      SELECT * FROM test_table;\                      DROP TABLE test_table");if (status){  printf("Could not execute statement(s)");  mysql_close(mysql);  exit(0);}/* process each statement result */do {  /* did current statement return data? */  result = mysql_store_result(mysql);  if (result)  {    /* yes; process rows and free the result set */    process_result_set(mysql, result);    mysql_free_result(result);  }  else          /* no result set or error */  {    if (mysql_field_count(mysql) == 0)    {      printf("%lld rows affected\n",            mysql_affected_rows(mysql));    }    else  /* some error occurred */    {      printf("Could not retrieve result set\n");      break;    }  }  /* more results? -1 = no, >0 = error, 0 = yes (keep looping) */  if ((status = mysql_next_result(mysql)) > 0)    printf("Could not execute statement\n");} while (status == 0);mysql_close(mysql);

27.7.20 C API编写的语句处理日期和时间值

二进制(声明)协议使您能够发送和接收日期和时间值(DATETIMEDATETIME,和TIMESTAMP),使用MySQL _时结构。这个结构的成员了第27.7.9,“C API编写报表数据结构”

发送时间的数据值,创建一个准备好的声明中使用mysql_stmt_prepare()。然后,在调用mysql_stmt_execute()执行该语句,使用以下步骤设定各时间参数:

  1. MYSQL_BIND结构与数据值有关,设置buffer_type成员类型表明什么样的时间价值你发送。为DATETIMEDATETIME,或TIMESTAMP值,设置buffer_typeMYSQL_TYPE_DATEMySQL _型_时MYSQL_TYPE_DATETIME,或MySQL _型_时间戳,分别

  2. 设置buffer的成员MySQL _绑定结构的地址MYSQL_TIME结构中,你通过时间价值。

  3. 填写的成员MYSQL_TIME结构是适合通过时间值的类型。

使用mysql_stmt_bind_param()绑定参数数据表。然后你可以打电话mysql_stmt_execute()

检索的时间值,该程序是类似的,除了你的buffer_type成员的类型的值你期望得到的,和缓冲区成员的地址MYSQL_TIME结构,返回值应该放。使用mysql_stmt_bind_result()将缓冲器的声明之后调用mysql_stmt_execute()在取结果

这里是一个简单的例子,插入DATETIME,和TIMESTAMP数据这个MySQL变量被认为是一个有效的连接处理。

  MYSQL_TIME  ts;
  MYSQL_BIND  bind[3];
  MYSQL_STMT  *stmt;

  strmov(query, "INSERT INTO test_table(date_field, time_field, \
                               timestamp_field) VALUES(?,?,?");

  stmt = mysql_stmt_init(mysql);
  if (!stmt)
  {
    fprintf(stderr, " mysql_stmt_init(), out of memory\n");
    exit(0);
  }
  if (mysql_stmt_prepare(mysql, query, strlen(query)))
  {
    fprintf(stderr, "\n mysql_stmt_prepare(), INSERT failed");
    fprintf(stderr, "\n %s", mysql_stmt_error(stmt));
    exit(0);
  }

  /* set up input buffers for all 3 parameters */
  bind[0].buffer_type= MYSQL_TYPE_DATE;
  bind[0].buffer= (char *)&ts;
  bind[0].is_null= 0;
  bind[0].length= 0;
  ...
  bind[1]= bind[2]= bind[0];
  ...

  mysql_stmt_bind_param(stmt, bind);

  /* supply the data to be sent in the ts structure */
  ts.year= 2002;
  ts.month= 02;
  ts.day= 03;

  ts.hour= 10;
  ts.minute= 45;
  ts.second= 20;

  mysql_stmt_execute(stmt);
  ..

27.7.21 C API编写的调用语句支持

本节描述了事先准备好的声明支持在C API使用存储过程执行CALL声明:

使用存储过程执行的准备CALL报表可以通过以下方式使用:

  • 存储过程可以产生任意数量的结果集。列数和列的数据类型不必相同的所有结果集。

  • 最后的值OUTINOUT手术后返回参数可调用的应用程序。这些参数是返回一个额外的单行结果集以下任何结果集由程序本身。列包含的值OUTINOUT在其过程中的参数列表宣布命令的参数。

下面的讨论显示了如何使用这些功能通过C API的准备好的语句。使用准备CALL报表通过PREPAREEXECUTE报表,看第13.2.1,“调用语法”

一个应用程序,执行准备CALL声明应该使用一个循环,取结果,然后调用mysql_stmt_next_result()以确定是否有更多的结果。结果包括任何结果集的存储过程所遵循的最终状态值,指示程序成功终止。

如果程序OUTINOUT参数,结果集之前最后的状态值包含它们的值。判断一个结果集包含的参数值,测试是否SERVER_PS_OUT_PARAMS位设置在server_status的成员MYSQL连接处理:

MySQL -&#62; server_status和server_ps_out_params

下面的示例使用准备CALL语句执行一个存储过程,产生多个结果集,通过提供参数值返回给调用者INOUT参数.该程序是以各类型的参数(进入OUTINOUT),显示其初始值,指定新的值,显示更新后的值,并返回。预期收益的信息从程序因此由多个结果集和最终状态:

  • 结果从SELECT显示参数初始值:NULL三十。(The)OUT参数是由调用方分配一个值,但这个任务将是无效的:参数作为NULL在过程直到分配一个值在程序。)

  • 结果从SELECT显示修改后的参数值:一百200三百

  • 一个结果集包含的最后OUTINOUT参数值:200三百

  • 最终状态分组

代码执行程序:

MYSQL_STMT *stmt;
MYSQL_BIND ps_params[3];  /* input parameter buffers */
int        int_data[3];   /* input/output values */
bool       is_null[3];    /* output value nullability */
int        status;

/* set up stored procedure */
status = mysql_query(mysql, "DROP PROCEDURE IF EXISTS p1");
test_error(mysql, status);

status = mysql_query(mysql,
  "CREATE PROCEDURE p1("
  "  IN p_in INT, "
  "  OUT p_out INT, "
  "  INOUT p_inout INT) "
  "BEGIN "
  "  SELECT p_in, p_out, p_inout; "
  "  SET p_in = 100, p_out = 200, p_inout = 300; "
  "  SELECT p_in, p_out, p_inout; "
  "END");
test_error(mysql, status);

/* initialize and prepare CALL statement with parameter placeholders */
stmt = mysql_stmt_init(mysql);
if (!stmt)
{
  printf("Could not initialize statement\n");
  exit(1);
}
status = mysql_stmt_prepare(stmt, "CALL p1(?, ?, ?)", 16);
test_stmt_error(stmt, status);

/* initialize parameters: p_in, p_out, p_inout (all INT) */
memset(ps_params, 0, sizeof (ps_params));

ps_params[0].buffer_type = MYSQL_TYPE_LONG;
ps_params[0].buffer = (char *) &int_data[0];
ps_params[0].length = 0;
ps_params[0].is_null = 0;

ps_params[1].buffer_type = MYSQL_TYPE_LONG;
ps_params[1].buffer = (char *) &int_data[1];
ps_params[1].length = 0;
ps_params[1].is_null = 0;

ps_params[2].buffer_type = MYSQL_TYPE_LONG;
ps_params[2].buffer = (char *) &int_data[2];
ps_params[2].length = 0;
ps_params[2].is_null = 0;

/* bind parameters */
status = mysql_stmt_bind_param(stmt, ps_params);
test_stmt_error(stmt, status);

/* assign values to parameters and execute statement */
int_data[0]= 10;  /* p_in */
int_data[1]= 20;  /* p_out */
int_data[2]= 30;  /* p_inout */

status = mysql_stmt_execute(stmt);
test_stmt_error(stmt, status);

/* process results until there are no more */
do {
  int i;
  int num_fields;       /* number of columns in result */
  MYSQL_FIELD *fields;  /* for result set metadata */
  MYSQL_BIND *rs_bind;  /* for output buffers */

  /* the column count is > 0 if there is a result set */
  /* 0 if the result is only the final status packet */
  num_fields = mysql_stmt_field_count(stmt);

  if (num_fields > 0)
  {
    /* there is a result set to fetch */
    printf("Number of columns in result: %d\n", (int) num_fields);

    /* what kind of result set is this? */
    printf("Data: ");
    if(mysql->server_status & SERVER_PS_OUT_PARAMS)
      printf("this result set contains OUT/INOUT parameters\n");
    else
      printf("this result set is produced by the procedure\n");

    MYSQL_RES *rs_metadata = mysql_stmt_result_metadata(stmt);
    test_stmt_error(stmt, rs_metadata == NULL);

    fields = mysql_fetch_fields(rs_metadata);

    rs_bind = (MYSQL_BIND *) malloc(sizeof (MYSQL_BIND) * num_fields);
    if (!rs_bind)
    {
      printf("Cannot allocate output buffers\n");
      exit(1);
    }
    memset(rs_bind, 0, sizeof (MYSQL_BIND) * num_fields);

    /* set up and bind result set output buffers */
    for (i = 0; i < num_fields; ++i)
    {
      rs_bind[i].buffer_type = fields[i].type;
      rs_bind[i].is_null = &is_null[i];

      switch (fields[i].type)
      {
        case MYSQL_TYPE_LONG:
          rs_bind[i].buffer = (char *) &(int_data[i]);
          rs_bind[i].buffer_length = sizeof (int_data);
          break;

        default:
          fprintf(stderr, "ERROR: unexpected type: %d.\n", fields[i].type);
          exit(1);
      }
    }

    status = mysql_stmt_bind_result(stmt, rs_bind);
    test_stmt_error(stmt, status);

    /* fetch and display result set rows */
    while (1)
    {
      status = mysql_stmt_fetch(stmt);

      if (status == 1 || status == MYSQL_NO_DATA)
        break;

      for (i = 0; i < num_fields; ++i)
      {
        switch (rs_bind[i].buffer_type)
        {
          case MYSQL_TYPE_LONG:
            if (*rs_bind[i].is_null)
              printf(" val[%d] = NULL;", i);
            else
              printf(" val[%d] = %ld;",
                     i, (long) *((int *) rs_bind[i].buffer));
            break;

          default:
            printf("  unexpected type (%d)\n",
              rs_bind[i].buffer_type);
        }
      }
      printf("\n");
    }

    mysql_free_result(rs_metadata); /* free metadata */
    free(rs_bind);                  /* free output buffers */
  }
  else
  {
    /* no columns = final status packet */
    printf("End of procedure output\n");
  }

  /* more results? -1 = no, >0 = error, 0 = yes (keep looking) */
  status = mysql_stmt_next_result(stmt);
  if (status > 0)
    test_stmt_error(stmt, status);
} while (status == 0);

mysql_stmt_close(stmt);

要执行的程序产生以下输出:

Number of columns in result: 3
Data: this result set is produced by the procedure
 val[0] = 10; val[1] = NULL; val[2] = 30;
Number of columns in result: 3
Data: this result set is produced by the procedure
 val[0] = 100; val[1] = 200; val[2] = 300;
Number of columns in result: 2
Data: this result set contains OUT/INOUT parameters
 val[0] = 200; val[1] = 300;
End of procedure output

该代码使用两个实用程序,test_error()test_stmt_error(),检查错误和打印诊断信息如果有错误发生后终止:

static void test_error(MYSQL *mysql, int status)
{
  if (status)
  {
    fprintf(stderr, "Error: %s (errno: %d)\n",
            mysql_error(mysql), mysql_errno(mysql));
    exit(1);
  }
}

static void test_stmt_error(MYSQL_STMT *stmt, int status)
{
  if (status)
  {
    fprintf(stderr, "Error: %s (errno: %d)\n",
            mysql_stmt_error(stmt), mysql_stmt_errno(stmt));
    exit(1);
  }
}

27.7.22 C API编写的语句的问题

以下是一个清单,目前已知的有准备的陈述问题:

27.7.23 C API的可选的结果集元数据

当用户执行一个语句产生一个结果集,MySQL默认提供的数据结果集包含结果集的元数据,并提供有关结果的信息数据集。元数据包含在MYSQL_FIELD结构(见第27.7.5,“C API的数据结构”),这是由mysql_fetch_field()mysql_fetch_field_direct(),和mysql_fetch_fields()功能.

客户可以基于每一连接,结果集元数据是可选的,客户端将指示服务器是否返回它。元数据转移抑制可以提高性能,特别是执行多个查询返回的几排次。

有两种方法来显示结果集元数据是可选的连接。它们是等价的,所以一个就够了:

  • 在连接时,使CLIENT_OPTIONAL_RESULTSET_METADATA国旗的客户端_旗争论mysql_real_connect()

  • 连接之前,使MYSQL_OPT_OPTIONAL_RESULTSET_METADATA选项mysql_options()

元数据可选连接,客户端设置resultset_metadata系统变量控制是否服务器返回结果集元数据。允许值全部(返回所有元数据;这是默认的),NONE(return no metaders).

可选的元数据的连接,mysql_fetch_field()mysql_fetch_field_direct(),和mysql_fetch_fields()函数返回无效的resultset_metadata系统变量设置为

检查结果集的元数据,使用mysql_result_metadata()功能。这个函数返回resultset_metadata_fullRESULTSET_METADATA_NONE结果集的元数据或没有元数据,分别。

mysql_result_metadata()可如果客户事先并不知道是否有结果集元数据。例如,如果一个客户执行存储过程,返回多个结果集,可能会改变resultset_metadata系统变量,客户端可以调用mysql_result_metadata()每个结果集,以确定它是否有元数据。

对于没有元数据可选的连接设置resultset_metadata产生一个错误

27.7.24 C API自动重联控制

MySQL客户端库可以执行自动重新连接到服务器,如果发现连接关闭当您尝试发送一个报表服务器将执行。如果自动重新启用,图书馆再次试图连接到服务器并发送声明再次。

自动重新连接默认是禁用的。

如果知道的连接已中断您的应用程序是很重要的(这样可以退出或采取行动调整状态信息的丢失),确保自动重新连接被禁用。为了确保这一点,叫mysql_options()mysql_opt_reconnect选项:

bool reconnect = 0;
mysql_options(&mysql, MYSQL_OPT_RECONNECT, &reconnect);

如果连接已经下降,影响mysql_ping()取决于自动重新连接状态。如果启用自动重新连接,mysql_ping()执行一个连接。否则,它将返回一个错误。

一些客户端程序可以提供自动重联控制的能力。例如,MySQL将默认的,但--skip-reconnect选项可以用来抑制这种行为。

如果一个自动重联发生(例如,由于调用mysql_ping()),没有明确的迹象表明它。检查重联,电话mysql_thread_id()在打电话之前把原来的连接标识符mysql_ping(),然后调用mysql_thread_id()再次看到标识符是否改变。

自动重联可以方便因为你不需要实现自己的连接代码,但是如果一个重联发生,该连接状态等几个方面进行复位,在服务器端应用程序将不另行通知。

连接相关的状态是影响如下:

  • 所有活动的事务回滚和autocommit模式复位。

  • 所有的表锁被释放

  • 全部TEMPORARY表格是封闭的(下降)。

  • 会议系统变量初始化为相应系统全局变量的值,包括通过诸如隐式地设置系统变量SET NAMES

  • 用户变量的设置都将丢失。

  • 准备财务报表发布

  • HANDLER变量是封闭的

  • 价值LAST_INSERT_ID()重置为0

  • 锁收购GET_LOCK()被释放

  • 与客户的关联性能模式threads表格行决定连接螺纹仪表丢失。如果客户端重新连接断开后,会在新的一行相关threads表和监控线程状态可能不同。看到第25.11.16.3,“线程表”

如果重新连接时,任何SQL语句指定的要求mysql_options()mysql_init_command选择是重新执行

如果连接丢失,这可能是与服务器端的连接关联的会话仍然是如果服务器尚未发现客户不再连接运行。在这种情况下,任何锁,由原来的连接仍然属于会话,所以你可能想叫杀了它mysql_kill()

27.7.25 C API的常见问题

27.7.25.1为什么mysql_store_result()有时返回null mysql_query()返回成功后

这是可能的mysql_store_result()返回无效的一个成功的电话mysql_query()。当这一切发生的时候,它意味着有下列情况发生:

  • 有一个malloc()失败(例如,如果结果集太大)。

  • 不能读取数据(在连接时出错)。

  • 查询未返回任何数据(例如,这是一个INSERTUPDATE,或DELETE

你总是可以检查是否声明应该通过调用产生一个空的结果mysql_field_count()。如果mysql_field_count()返回零,结果是空的,最后一个语句查询不返回值(例如,一个INSERTDELETE)。ifmysql_field_count()返回一个非零值,声明应该产生一个空的结果。看到的描述mysql_field_count()function for an example。

你可以通过调用测试错误mysql_error()mysql_errno()

27.7.25.2什么结果,你可以从一个查询

除了结果集返回的查询,您还可以得到以下信息:

27.7.25.3如何最后插入的行得到唯一的ID

如果你插入一条记录到一个表中,包含一个AUTO_INCREMENT柱,你可以获得存储在列的值调用mysql_insert_id()功能

你可以检查你的C语言应用程序值是否被存储在一个AUTO_INCREMENT通过执行下面的代码(假设你已经检查过的语句成功)。它确定查询是否是一个INSERT一个汽车索引:

if ((result = mysql_store_result(&mysql)) == 0 &&
    mysql_field_count(&mysql) == 0 &&
    mysql_insert_id(&mysql) != 0)
{
    used_id = mysql_insert_id(&mysql);
}

当一个新的AUTO_INCREMENT价值已经产生,也可以通过执行获得选择last_insert_id()声明mysql_query()从结果中检索值的设置由语句返回。

当插入多个值,最后自动递增的值被返回。

LAST_INSERT_ID(),最近生成的ID保存在服务器上的每一个连接的基础上。它不是由另一个客户端的改变。是不是即使你更新的另一个改变汽车一个非幻值列(即值不是NULL而不是)。usingLAST_INSERT_ID()汽车柱同时从多个客户是完全有效的。每个客户将收到的最后插入ID的最后声明那个客户执行

如果你想用的ID是一个表生成和插入一个表格,你可以使用SQL语句这样:

INSERT INTO foo (auto,text)
    VALUES(NULL,'text');         # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table

mysql_insert_id()返回的值存储到一个汽车柱,无论价值是由存储的自动生成NULL或被指定为一个显式值。LAST_INSERT_ID()只有自动生成的回报汽车价值观。如果你店里的一个明确的价值比其他NULL,它不影响返回的值LAST_INSERT_ID()

在获取上身份的更多信息AUTO_INCREMENT专栏

27.8 MySQL,PHP的API

MySQL PHP API手册已出版独立的形式,不作为MySQL参考手册的一部分。看到MySQL和PHP

27.9 MySQL Perl API

PerlDBI模块提供了对数据库访问的通用接口。你可以写一个DBI脚本,作品有许多不同的数据库引擎没有变化。使用DBI与MySQL,安装以下:

  1. 这个DBI模块

  2. 这个DBD::mysql模块这是数据库驱动程序(DBD)模块的Perl。

  3. 或者,其他任何类型的数据库服务器需要访问介质阻挡放电模块。

Perl是推荐的Perl接口。它取代了旧的接口称为mysqlperl你应该认为这是过时的。

这部分包含有关使用Perl和MySQL写的MySQL应用Perl信息:

DBI的信息可在命令行中,在线,或印刷形式:

  • 一旦你有了DBIDBD::MySQL模块安装,您可以在命令行得到关于他们的信息perldoc命令:

    内核&#62;perldoc DBI内核&#62;perldoc DBI::FAQ内核&#62;perldoc DBD::mysql

    你也可以使用pod2manpod2html,等等,将这些信息转换成其他格式。

  • 关于Perl DBI在线信息,访问网站,dbi.perl.org http:/ / /。该网站主机一般DBI的邮件列表。甲骨文公司的主机列表具体DBD::mysql它;第1.6.2,MySQL邮件列表”

  • 印刷信息,官方的DBI的书the Programming Perl DBI(鳄鱼笛卡尔和Tim Bunce O&#39;Reilly &#38; Associates,2000)。关于这本书的信息可以在DBI的网站,dbi.perl.org http:/ / /

MySQL的Python API的范围

MySQLdb是一个第三方驱动,Python MySQL提供支持,符合Python数据库API版本2。它可以发现在http://SourceForge.net的Python /项目/ MySQL /

新的MySQL连接器/ Python组件提供相同的Python API接口,并内置到MySQL服务器和Oracle支持。看到MySQL连接器/ Python开发者指南在连接器的详细信息,以及编码的Python应用程序和Python代码的指南。

27.11 MySQL Ruby API

两个API可用于Ruby程序员开发的MySQL应用:

背景和语法关于Ruby语言的信息,参见Ruby编程语言

27.11.1 MySQL / Ruby API

MySQL /红宝石模块提供使用Ruby通过MySQL数据库libmysqlclient

关于安装的模块的信息,和暴露的函数,看MySQL /红宝石

27.11.2红宝石/ MySQL的API

红宝石/ MySQL模块提供了通过使用MySQL网络协议的本地驱动程序接口使用Ruby的MySQL数据库。

关于安装的模块的信息,和暴露的函数,看红宝石/ MySQL

27.12 MySQL TCL API

MySQLtcl是从访问MySQL数据库服务器的一个简单的APITCL编程语言。它可以发现在www.xdobry.de mysqltcl http:/ / / /

MySQL的包装小于艾菲尔

埃菲尔MySQL是一个接口连接到MySQL数据库服务器使用Eiffel编程语言,Michael Ravits写的。它可以发现在efsa.sourceforge.net http:/ / / / / mysql.htm ravits档案