📄 manual_clients.html
字号:
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
<style type="text/css">
<!--
.p14{font-size:14.8px;font-family:宋体;line-height:14pt;}
.p5{ border: 1px solid rgb(146,201,201) }
.a:hover{color:red;}
a.t1:visited{color:red;}
-->
</style>
<title>MySQL中文参考手册- 20 MySQL客户工具和API</title>
</head>
<body BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#101090" VLINK="#7030B0" class="p4">
<h1><img src="Img/mysql-logo.gif" alt="mysql-logo.gif (3082 bytes)" WIDTH="127" HEIGHT="60"><font color="#FF0000">MySQL中文参考手册</font></h1>
<p>翻译:<a href="mailto:clyan@sohu.com">晏子</a>(yanzi)
主页:<a href="http://linuxdn.yeah.net">http://linuxdb.yeah.net</a></p>
<hr>
<p><a HREF="manual_Introduction.html">第一章</a>, <a HREF="manual_Common_problems.html">前一章</a>,
<a HREF="manual_Comparisons.html">下一章</a>, <a HREF="manual_Concept_Index.html">最后一章</a>,<a HREF="manual_toc.html">目录</a>. </p>
<hr>
<h1><a NAME="Clients" HREF="manual_toc.html#Clients">20 MySQL客户工具和API</a></h1>
<h2><a NAME="C" HREF="manual_toc.html#C">20.1 MySQL C API</a></h2>
<p>C API代码是随<strong>MySQL</strong>分发的,它被包含在<code>mysqlclient</code>库且允许C程序存取一个数据库。</p>
<p>在 MySQL源代码分发中的很多客户是用C编写的。如果你正在寻找演示怎样使用C
API的例子,看一下这些客户程序。</p>
<p>大多数其他客户 API(除了Java的所有)都使用<code>mysqlclient</code>库与<strong>MySQL</strong>服务器通信。这意味着,例如,你能利用很多被其他客户程序使用的同一环境变量,因为他们从库中引用。对这些变量的一张表,见<a HREF="manual_Tools.html#Programs">12.1 不同的MySQL程序的概述</a>。 </p>
<p>客户有一个最大通讯缓冲区大小。初始分配的缓冲区大小(16K字节)
自动地增加到最大尺寸(缺省的最大值是24M)。因为缓冲区大小只是按保证需求而被增加,简单地增加缺省的最大限制并不造成更多被消耗。该尺寸检查主要是一个对错误的查询和通讯包的检查。</p>
<p>通讯缓冲区必须足够大以便一个单独的SQL语句(对客户-服务器传输)和一行返回的数据(对服务器-客户传输)。每个线程的通讯缓冲区被动态扩大到最大限制来处理任何查询或行。例如,如果你包含大到16M数据的<code>BLOB</code>值,你必须有一个至少16M通讯缓冲区限制(在服务器和客户两端)。客户的缺省最大值是24M,但是在服务器端的缺省最大值是1M。你可以在服务器启动时通过改变<code>max_allowed_packet</code>参数的值来改变它。见<a HREF="manual_Performance.html#Server_parameters">10.2.3 调节服务器参数</a>。</p>
<p><strong>MySQL</strong>服务器在每个查询后缩小每个通讯缓冲区到<code>net_buffer_length</code>个字节。对客户,与一个连接相关的缓冲区的大小没被减少,直到连接被关闭,在此时客户内存被回收。
</p>
<p>如果你用线程的编程,你应该用<code>--with-thread-safe-client</code>编译<strong>MySQL</strong>
C API,这将使C API线程对每个连接更安全。你可以让2个线程共享相同的连接,只要如果你做下列事情:
<dl COMPACT="manual_Performance.html#Server_parameters">
<dd>两个线程不能同时在同一个连接上发送查询到<strong>MySQL</strong>。特别是你必须保证在一个<code>mysql_query()</code>和<code>mysql_store_result()</code>之间没有其他线程正在使用同一个连接。
</dd>
<dd>许多线程能存取用<code>mysql_store_result()</code>检索出来的不同结果集合。</dd>
<dd>如果你使用<code>mysql_use_result</code>,你必须保证没有其他线程在同一个连接上正在询问任何东西,直到结果集合被关闭。
</dd>
</dl>
<h2><a NAME="C_API_datatypes" HREF="manual_toc.html#C_API_datatypes">20.2 C API数据类型</a></h2>
<dl COMPACT="C_API_datatypes">
<dt><code>MYSQL</code> </dt>
<dd><a NAME="IDX716"></a>这个结构表示对一个数据库连接的句柄,它被用于几乎所有的<strong>MySQL</strong>函数。
<a NAME="IDX717"></a> </dd>
<dt><code>MYSQL_RES</code> </dt>
<dd>这个结构代表返回行的一个查询的(<code>SELECT</code>, <code>SHOW</code>, <code>DESCRIBE</code>,
<code>EXPLAIN</code>)的结果。从查询返回的信息在本章下文称为<em>结果集合</em>。</dd>
<dt><code>MYSQL_ROW</code> </dt>
<dd>这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节)
行通过调用<code>mysql_fetch_row()</code>获得。 <a NAME="IDX719"></a> </dd>
<dt><code>MYSQL_FIELD</code> </dt>
<dd>这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用<code>mysql_fetch_field()</code>对每一列获得<code>MYSQL_FIELD</code>结构。字段值不是这个结构的部分;他们被包含在一个<code>MYSQL_ROW</code>结构中。</dd>
<dt><code>MYSQL_FIELD_OFFSET</code> </dt>
<dd>这是一个相对一个<strong>MySQL</strong>字段表的偏移量的类型安全的表示。(由<code>mysql_field_seek()</code>使用。)
偏移量是在一行以内的字段编号,从0开始。<a NAME="IDX721"></a> <a NAME="IDX722"></a> </dd>
<dt><code>my_ulonglong</code> </dt>
<dd>该类型用于行编号和<code>mysql_affected_rows()</code>、<code>mysql_num_rows()</code>和<code>mysql_insert_id()</code>。这种类型提供<code>0</code>到<code>1.84e19</code>的一个范围。在一些系统上,试图打印类型<code>my_ulonglong</code>的值将不工作。为了打印出这样的值,将它变换到<code>unsigned
long</code>并且使用一个<code>%lu</code>打印格式。例如:<pre>printf (Number of rows: %lu\n", (unsigned long) mysql_num_rows(result));
</pre>
</dd>
</dl>
<p><code>MYSQL_FIELD</code>结构包含列在下面的成员:
<dl COMPACT="IDX722">
<dt><code>char * name</code> </dt>
<dd>字段名,是一个空结尾的字符串。</dd>
<dt><code>char * table</code> </dt>
<dd>包含该字段的表的名字,如果它不是可计算的字段。对可计算的字段,<code>table</code>值是一个空字符串。</dd>
<dt><code>char * def</code> </dt>
<dd>这字段的缺省值,是一个空结尾的字符串。只要你使用,只有你使用<code>mysql_list_fields()</code>才可设置它。</dd>
<dt><code>enum enum_field_types type</code> </dt>
<dd>字段类型。<code>type</code>值可以是下列之一:<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<tr>
<td><strong>类型值</strong> </td>
<td><strong>类型含义</strong></td>
</tr>
<tr>
<td><code>FIELD_TYPE_TINY</code> </td>
<td><code>TINYINT</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_SHORT</code> </td>
<td><code>SMALLINT</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_LONG</code> </td>
<td><code>INTEGER</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_INT24</code> </td>
<td><code>MEDIUMINT</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_LONGLONG</code> </td>
<td><code>BIGINT</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_DECIMAL</code> </td>
<td><code>DECIMAL</code>或<code>NUMERIC</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_FLOAT</code> </td>
<td><code>FLOAT</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_DOUBLE</code> </td>
<td><code>DOUBLE</code>或<code>REAL</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_TIMESTAMP</code> </td>
<td><code>TIMESTAMP</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_DATE</code> </td>
<td><code>DATE</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_TIME</code> </td>
<td><code>TIME</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_DATETIME</code> </td>
<td><code>DATETIME</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_YEAR</code> </td>
<td><code>YEAR</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_STRING</code> </td>
<td>字符串(<code>CHAR</code>或<code>VARCHAR</code>)字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_BLOB</code> </td>
<td><code>BLOB</code>或<code>TEXT</code>字段(使用<code>max_length</code>决定最大长度)</td>
</tr>
<tr>
<td><code>FIELD_TYPE_SET</code> </td>
<td><code>SET</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_ENUM</code> </td>
<td><code>ENUM</code>字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_NULL</code> </td>
<td><code>NULL</code>- 类型字段</td>
</tr>
<tr>
<td><code>FIELD_TYPE_CHAR</code> </td>
<td>不推荐;使用<code>FIELD_TYPE_TINY</code>代替</td>
</tr>
</table>
<p>你可以使用<code>IS_NUM()</code>宏来测试字段是否有一种数字类型。将<code>type</code>值传给<code>IS_NUM()</code>并且如果字段是数字的,它将计算为TRUE:</p>
<pre>if (IS_NUM(field->type))
printf("Field is numeric\n");
</pre>
</dd>
<dt><code>unsigned int length</code> </dt>
<dd>字段宽度,在表定义中指定。</dd>
<dt><code>unsigned int max_length</code> </dt>
<dd>对结果集合的字段的最大宽度(对实际在结果集合中的行的最长字段值的长度)。如果你使用<code>mysql_store_result()</code>或<code>mysql_list_fields()</code>,这包含字段最大长度。如果你使用<code>mysql_use_result()</code>,这个变量的值是零。</dd>
<dt><code>unsigned int flags</code> </dt>
<dd>字段的不同位标志。<code>flags</code>值可以是零个或多个下列位设置:<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<tr>
<td><strong>标志值</strong> </td>
<td><strong>标志含义</strong></td>
</tr>
<tr>
<td><code>NOT_NULL_FLAG</code> </td>
<td>字段不能是<code>NULL</code> </td>
</tr>
<tr>
<td><code>PRI_KEY_FLAG</code> </td>
<td>字段是一个主键的一部分</td>
</tr>
<tr>
<td><code>UNIQUE_KEY_FLAG</code> </td>
<td>字段是一个唯一键的一部分</td>
</tr>
<tr>
<td><code>MULTIPLE_KEY_FLAG</code> </td>
<td>字段是一个非唯一键的一部分。 </td>
</tr>
<tr>
<td><code>UNSIGNED_FLAG</code> </td>
<td>字段有<code>UNSIGNED</code>属性</td>
</tr>
<tr>
<td><code>ZEROFILL_FLAG</code> </td>
<td>字段有<code>ZEROFILL</code>属性</td>
</tr>
<tr>
<td><code>BINARY_FLAG</code> </td>
<td>字段有<code>BINARY</code>属性</td>
</tr>
<tr>
<td><code>AUTO_INCREMENT_FLAG</code> </td>
<td>字段有<code>AUTO_INCREMENT</code>属性</td>
</tr>
<tr>
<td><code>ENUM_FLAG</code> </td>
<td>字段是一个<code>ENUM</code>(不推荐)</td>
</tr>
<tr>
<td><code>BLOB_FLAG</code> </td>
<td>字段是一个<code>BLOB</code>或<code>TEXT</code>(不推荐)</td>
</tr>
<tr>
<td><code>TIMESTAMP_FLAG</code> </td>
<td>字段是一个<code>TIMESTAMP</code>(不推荐)</td>
</tr>
</table>
<p><code>BLOB_FLAG</code>、<code>ENUM_FLAG</code>和<code>TIMESTAMP_FLAG</code>标志的使用是不推荐的,因为他们指出字段的类型而非它的类型属性。对<code>FIELD_TYPE_BLOB</code>、<code>FIELD_TYPE_ENUM</code>或<code>FIELD_TYPE_TIMESTAMP</code>,最好是测试<code>field->type</code>。下面例子演示了一个典型的<code>flags</code>值用法:</p>
<pre>if (field->flags & NOT_NULL_FLAG)
printf("Field can't be null\n");
</pre>
<p>你可以使用下列方便的宏决来确定<code>flags</code>值的布尔状态:</p>
<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<tr>
<td><code>IS_NOT_NULL(flags)</code> </td>
<td>真,如果该字段被定义为<code>NOT NULL</code> </td>
</tr>
<tr>
<td><code>IS_PRI_KEY(flags)</code> </td>
<td>真,如果该字段是一个主键</td>
</tr>
<tr>
<td><code>IS_BLOB(flags)</code> </td>
<td>真,如果该字段是一个<code>BLOB</code>或<code>TEXT</code>(不推荐;相反测试<code>field->type</code>)</td>
</tr>
</table>
</dd>
<dt><code>unsigned int decimals</code> </dt>
<dd>对数字字段的小数位数。</dd>
</dl>
<h2><a NAME="C_API_function_overview" HREF="manual_toc.html#C_API_function_overview">20.3
C API函数概述</a></h2>
<p>在 C API 中可用的函数列在下面,并且在下一节更详细地描述。见<a HREF="manual_Clients.html#C_API_functions">20.4 C API函数描述</a>。</p>
<table BORDER="1" WIDTH="100%" NOSAVE="#101090" class="p4">
<tr>
<td><strong>mysql_affected_rows()</strong> </td>
<td>返回被最新的<code>UPDATE</code>, <code>DELETE</code>或<code>INSERT</code>查询影响的行数。</td>
</tr>
<tr>
<td><strong>mysql_close()</strong> </td>
<td>关闭一个服务器连接。 </td>
</tr>
<tr>
<td><strong>mysql_connect()</strong> </td>
<td>连接一个<strong>MySQL</strong>服务器。该函数不推荐;使用<code>mysql_real_connect()</code>代替。
</td>
</tr>
<tr>
<td><strong>mysql_change_user()</strong> </td>
<td>改变在一个打开的连接上的用户和数据库。 </td>
</tr>
<tr>
<td><strong>mysql_create_db()</strong> </td>
<td>创建一个数据库。该函数不推荐;而使用SQL命令<code>CREATE DATABASE</code>。</td>
</tr>
<tr>
<td><strong>mysql_data_seek()</strong></td>
<td>在一个查询结果集合中搜寻一任意行。</td>
</tr>
<tr>
<td><strong>mysql_debug()</strong></td>
<td>用给定字符串做一个<code>DBUG_PUSH</code>。 </td>
</tr>
<tr>
<td><strong>mysql_drop_db()</strong></td>
<td>抛弃一个数据库。该函数不推荐;而使用SQL命令<code>DROP DATABASE</code>。
</td>
</tr>
<tr>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -