转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
如何处理MYSQL查询(3)         ★★★★

如何处理MYSQL查询(3)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:672 更新时间:2009/4/22 20:44:35
集的所有行,它限制了服务器,并对其他客户机程序产生负面的影响,因为检索数据的表在查询过程中是读锁定的。要更新表的客户机或要插入行的任何客户机程序都被阻塞。
    偏移由mysql_store_result() 引起的额外内存需求对一次访问整个结果集带来相当的好处。结果集中的所有行都是有效的,因此,可以任意访问: mysql_ data _ seek( )、mysql_ rowseek( )和mysql_row_tell() 函数允许以任意次序访问行。而mysql_use_result() 只能以mysql_fetch_row() 检索的顺序访问行。如果想要以任意次序而不是从服务器返回的次序来处理行,就必须使用mysql_ store _ result( )。例如,如果允许用户来回地浏览查询所选的行,最好使用mysql_ store _ result( )。
    使用mysql_store_result() 可以获得在使用mysql_use_result() 时是无效的某些类型的列信息。通过调用mysql_num_rows() 来获得结果集的行数,每列中的这些值的最大宽度值存储在MYSQL_FIELD 列信息结构的max_width 成员中。使用mysql_ use _ result( ),直到提取完所有的行,mysql_num_rows() 才会返回正确值,而且max_width 无效,因为只有在每行的数据都显示后才能计算。
    由于mysql_use_result() 比mysql_store_result() 执行更少的操作,所以mysql_ use _ result( )就强加了一个mysql_store_result() 没有的需求:即客户机对结果集中的每一行都必须调用mysql_ fetch _ row( ),否则,结果集中剩余的记录就会成为下一个查询结果集中的一部分,并且发生“不同步”的错误。这种情形在使用mysql_store_result() 时不会发生,因为当函数返
回时,所有的行就已被获取。事实上,使用mysql_store_result() 就不必再自己调用mysql_ fetch _ row( )。对于所有感兴趣的事情就是是否得到一个非空的结果,而不是结果所包含的内容的查询来说,它是很有用的。例如,要知道表my_tbl 是否存在,可以执行下面的查询:
    SHOW TABLES LIKE "my_tb1"
    如果在调用mysql_store_result() 之后,mysql_num_rows() 的值为非零,这个表就存在,就不必再调用mysql_fetch_row() (当然仍需调用mysql_ free _ result( ))。如果要提供最大的灵活性,就给用户选择使用任一结果集处理方法的选项。mysql和mysqldump 是执行这个操作的两个程序,缺省时,使用mysql_ store _ result( ),但是如果指定--quick 选项,则使用mysql_ use _ result( )。
    6.6.6 使用结果集元数据
    结果集不仅包括数据行的列值,而且还包括数据信息,这些信息成为元数据结果集,包括:
    ■ 结果集中的行数和列数,通过调用mysql_num_rows() 和mysql_num_fields() 实现。
    ■ 行中每列值的长度,通过调用mysql_fetch_lengths() 实现。
    ■ 有关每列的信息, 例如列名和类型、每列值的最大宽度和列来源的表等。
    MYSQL_FIELD 结构存储这些信息,通过调用mysql_fetch_fields() 来获得它。附录F详细地描述了MYSQL_FIELD 结构,并列出了提供访问列信息的所有函数。元数据的有效性部分决定于结果集的处理方法,如在上节中提到的,如果要使用行计数或者列长度的最大值,就必须用mysql_store_result() 而不是mysql_use_result() 创建结果集。结果集元数据对确定有关如何处理结果集非常有帮助:
    ■ 列名和宽度信息对漂亮地生成带有列标题并垂直排列的格式化输出是非常有用的。
    ■ 使用列计数来确定处理数据行的连续列值的循环所迭代的次数。如果要分配取决于结果集中已知的行数或列数的数据结构,就可以使用行或列计数。
    ■ 可以确定列的数据类型。可以看出列是否是数字的,是否可能包括二进制数据等等。在前面的6.6.1节“处理返回结果集的查询”中,我们编写了从结果集的行中以制表符分隔的形式打印出结果的process_result_set() 程序。这对某些目的是很好的(例如要把数据输入到电子制表软件中),但对于可视化检查或打印输出,就不是一个漂亮的显示格式。回忆前面的process_result_set() 版本,产生过这样的输出:

    让我们在每列加上标题和边框来对process_result_set() 做些修改,以生成表格式的输出。这种修正版看上去更美观,输出的结果是相同的,如下所示:

    显示算法的基本要点是这样的:
    1) 确定每列的显示宽度。
    2) 打印一列带有边框的列标题(由垂直竖线和前后的虚线分隔)。
    3) 打印结果集每行的值、带边框的列(由垂直竖线分隔),并垂直排列,除此之外,打印
    正确的数字,将NULL 值打印为单词“NULL”。
    4) 最后,打印检索的行的计数。该练习为结果集元数据的使用提供了一个很好的示范。为了显示所描述的输出,除了行所包含的数据值之外,我们还需了解许多有关结果集的内容。您可能想,“这个描述听起来与mysql显示的输出惊人地相似”。是的,欢迎把mysql源代码和修正版的process_result_set() 代码比较一下,它们是不同的,可以发现对同一问题使用两种方法是有指导作用的。
    首先,我们需要确定每列的显示宽度,下面列出如何做这件事情。可观察到这些计算完全基于结果集元数据,无论行值是什么,它们都没有引用:

    列宽度通过结果集中列的MYSQL_FIELD 结构的迭代来计算,调用mysql_ fetch _ seek( )定位第一个结构,后续的mysql_fetch_field() 调用返回指向连续列的结构的指针。显示出来的列宽度是下面三个值中的最大值,其中每一个都取决于列信息结构中的元数据:
    ■ field - > name的长度,也就是列标题的长度。
    ■ field - > max _ length,列中最长的数据值的长度。
    ■ 如果列中可能包括NULL值,则为字符串“ NULL”的长度,field->flag 表明列是否包含NULL。请注意,已知要显示的列的宽度后,我们将这个值赋给max _ length,max_length 是从客户机库获取的结构中的一个成员。这种获取是允许的吗?或者MYSQL_FIELD 结构的内容应该为只读?一般来说,是“只读的”,但是MySQL分发包中的一些客户机程序以同样的方式改变了max_length 的值,因此,假设这也是正确的(如果更喜欢不改变max_length 值的方法,则分配一个unsigned int 值的数组,将计算的宽度存储到这个数组中)。显示宽度的计算包括一个说明,回想当使用mysql_use_result() 创建结果集时,max_length 没有意义。因为我们需要max_length 来确定列值的显示宽度,所以该算法的正确操作需要使用mysql_store_result() 产生的结果集( MYSQL _ FIELD结构的length 成员告知列值可以取得的最大值,如果使用mysql_store_result() 而不是mysql_ use _ result( )的话,这可能是个有用的工作环境)。
    一旦知道了列的宽度,就可以准备打印,处理标题很容易;对于给定的列,只需使用由field 指向的列信息结构,用已计算过的宽度打印出name 成员。

    对于数据,我们对结果集中的行进行循环,在每次迭代时打印当前行的列值。从行中打印列值有些技巧,因为值可能是NULL,也可能代表一个数(无论哪种情况都如实打印)。列值的打印如下,这里row[i] 包括数据值和指向列信息的field 指针:

    如果field->type 指明的列类型是数字型,如INT、FLOAT或者DECIMAL,那么宏IS _ NUM的值为真。显示该结果集的最终的代码如下所示。注意,因为我们需要多次打印虚线,所以这段代码封装在它自己的函数中,函数print_dashes() 是这样的:



    MySQL客户机库提供了访问列信息结构的几种方法,例如,前面样例的代码多次使用如下形式的循环访问这些结构:

    然而,mysql_field_seek() 与mysql_fetch_field() 的结合是获得MYSQL_FIELD 结构的唯一途径,可在附录F 中查看mysql_fetch_field() 函数和mysql_fetch_field_direct() 函数,寻找其他获得列信息结构的方法。


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台