Chinaunix首页 | 论坛 | 博客
  • 博客访问: 966105
  • 博文数量: 113
  • 博客积分: 7235
  • 博客等级: 少将
  • 技术积分: 2101
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 11:24
文章分类

全部博文(113)

文章存档

2013年(7)

2012年(5)

2011年(6)

2010年(8)

2009年(15)

2008年(72)

分类: LINUX

2008-12-23 21:37:44

第1章MySQL的历史和特性
1.1MySQL的历史
我们最初的出发点是,使用mSQL来连接我们的表,这类表采用了我们的快速低层面(ISAM)子程序。然而,经过一些测试后,我们得出结论,mSQL的速度 或灵活性不足以满足我们的要求。其结果是,为我们的数据库提供了新的SQL接口,但API接口与mSQL的几乎一样。设计该API的目的在于,允许将为 mSQL编写的第三方代码方便地移植到MySQL。
MySQL名称的起源不明。10多年来,我们的基本目录以及大量库和工具均采用了前缀“my”。不过,共同创办人Monty Widenius的女儿名字也叫“My”。时至今日,MySQL名称的起源仍是一个迷,即使对我们也一样。
MySQL Dolphin(我方徽标)的名称为“Sakila”,它是由MySQL AB公司的创办人从用户在“Dolphin命名”比赛中提供的众多建议中选定的。该名称是由来自非洲斯威士兰的开放源码软件开发人Ambrose Twebaze提出的。根据Ambrose的说法,按斯威士兰的本地语言,女性化名称Sakila源自SiSwati。Sakila也是坦桑尼亚、Arusha地区的一个镇的镇名,靠近Ambrose的母国乌干达。
1.2MYSQL的特性
下面介绍了MySQL数据库软件的一些重要特性。关于当前特性和即将提供特性的更多信息,请参见“MySQL发展大事记”  。
1.2.1MYSQL的特性
(1)内部构件和可移植性
(2)使用C和C++编写
(3)用众多不同的编译器进行了测试
(4)能够工作在众多不同的平台上,例如我们经常使用的linux,unix,windows, mac os 等。
(5)使用GNU Automake、Autoconf和Libtool进行移植。
(6)提供了用于C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl的API。
(7)采用核心线程的完全多线程 如果有多个CPU,它能方便地使用这些CPU。
(8)提供了事务性和非事务性存储引擎。
(9)使用了极快的“B树”磁盘表(MyISAM)和索引压缩。
(10)添加另一个存储引擎相对简单。如果打算为内部数据库添加一个SQL接口,该特性十分有用。
(11)极快的基于线程的内存分配系统。
(12)通过使用优化的“单扫描多连接”,能实现极快的连接。
(13)存储器中的哈希表用作临时表。
(14)SQL函数是使用高度优化的类库实现的,运行很快。通常,在完成查询初始化后,不存在存储器分配。
(15)采用Purify(商业内存溢出检测器)以及GPL工具Valgrind(http://developer.kde.org/~sewardj/)测试了MySQL代码。
(16)服务器可作为单独程序运行在客户端/服务器联网环境下。它也可作为库提供,可嵌入(链接)到独立的应用程序中。这类应用程序可单独使用,也能在网络环境下使用。
1.2.2列类型
(1)众多列类型: 带符号/无符号整数,1、2、3、4、8字节长,FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,TIME,DATETIME,TIMESTAMP,YEAR,SET,ENUM,以及OpenGIS空间类型。
(2)定长和可变长度记录。
1.2.3 语句和函数
(1)在SELECT和查询的WHERE子句中,提供完整的操作符和函数支持。例如:
mysql> SELECT CONCAT(first_name, ' ', last_name)
    -> FROM citizen
    -> WHERE income/dependents > 10000 AND age > 30;
(2)对SQL GROUP BY和ORDER BY子句的全面支持。支持聚合函数(COUNT(), COUNT(DISTINCT ...),AVG(),STD(),SUM(),MAX(),MIN()和GROUP_CONCAT())。
(3)支持LEFT OUTER JOIN和RIGHT OUTER JOIN,采用标准的SQL和ODBC语法。
(4)按照标准SQL的要求,支持表别名和列别名。
(5)DELETE、INSERT、REPLACE和UPDATE返回更改(影响)的行数。连接到服务器时,可通过设置标志返回匹配的行数。
(6)MySQL的SHOW命令可用于检索关于数据库、数据库引擎、表和索引的信息。EXPLAIN命令可用于确定优化器处理查询的方式。
(7)函数名与表名或列名不冲突。例如,ABS是有效的列名。唯一的限制在于,调用函数时,函数名和随后的符号“(”之间不得有空格
(8)可以将不同数据库的表混合在相同的查询中(就像MySQL 3.22中那样)。
1.2.4安全
十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全。
1.2.5可伸缩性和限制
(1)处理大型数据库: 我们使用了MySQL服务器和含5千万条记录的数据库。我们还听说,有些用户将MySQL用于含60000个表和约50亿行的数据库。
(2)每个表可支持高达64条索引(在MySQL 4.1.2之前为32条)。每条索引可由1~16个列或列元素组成。最大索引宽度为1000字节(在MySQL 4.1.2之前为500)。索引可使用具备CHAR、VARCHAR、BLOB或TEXT列类型的列前缀。
1.2.6连接性
(1)在任何平台上,客户端可使用TCP/IP协议连接到MySQL服务器。在Windows系统的NT系列中(NT、2000、XP或2003),客户端可使用命名管道进行连接。在Unix系统中,客户端可使用Unix域套接字文件建立连接。
(2)在MySQL 4.1和更高的版本中,如果是以“--shared-memory”选项开始,Windows服务器还支持共享内存连接。客户端可使用“--protocol=memory”选项,通过共享内存建立连接。
(3)Connector/ODBC (MyODBC)接口为使用ODBC(开放式数据库连接性)连接的客户端程序提供了MySQL支持。例如,可以使用MS Access连接到你的MySQL服务器。客户端可运行在Windows或Unix平台上。提供了MyODBC源。支持所有的ODBC 2.5函数,以及众多其他函数。请参见第26章:连接器。
(4)Connector/J接口为使用JDBC连接的Java客户端程序提供了MySQL支持。客户端可运行在Windows或Unix平台上。提供了Connector/J源码。
1.2.7本地化
(1)服务器可使用多种语言向客户端提供错误消息。
(2)对数种不同字符集的全面支持,包括latin1 (cp1252)、german、big5、ujis等。例如,在表名和列名中允许使用斯堪的纳维亚字符‘å’、‘ä’和‘ö’。从MySQL 4.1开始,提供了Unicode支持。
(3)所有数据均以所选的字符集保存。正常字符串列的比较不区分大小写。
(4)分类是根据所选的字符集(默认情况下,使用瑞典校对)进行的。启动MySQL服务器时,可更改该项设置。要想查看高级分类的示例,请参见Czech分类代码。MySQL服务器支持众多不同的字符集,这类字符集可在编译时和运行时指定。
1.2.8客户端和工具
(1)MySQL服务器提供了对SQL语句的内部支持,可用于检查、优化和修复表。通过mysqlcheck客户端,可在命令行上使用这类语句。MySQL还包括myisamchk,这是一种很快的命令行实用工具,可用于在MyISAM表上执行这类操作。
(2)对于所有MySQL程序,均能通过“-help”或“-?”选项调用,以获取联机帮助信息。
第2章MYSQL安装
2.1下载MYSQL
我们可以在这里下载mysql数据库:
http://dev.mysql.com/downloads/
2.2安装MYSQL
    当然,如果我们使用的是Ubuntu,则可以直接通过apt-get安装,方法如下:
(1)安装mysql服务器和客户端
sudo apt-get install mysql-server mysql-client
(2)如果我们要在C程序中使用mysql数据库,则还要安装mysql c 开发包:
sudo apt-get install libmysqlclient15-dev
这样在c程序中包含"musql.h"就可以使用mysql对c的 API了。
2.3编译使用了mysql数据库的c程序
    如果我们在c程序中使用了mysql数据库,则在使用gcc编译程序的时候,要添加一些参数才能使程序正确编译,编译方法如下:
gcc $(mysql_config --cflags) xxx.c -o xxx $(mysql_config --libs)
2.4测试安装的版本
mysqladmin version

第3章MYSQL的基本使用
3.1启动mysql数据库
    我们首先必须启动mysql服务器:
sudo /etc/init.d/mysql start
    现在我们可以在命令行上直接敲入:
mysql - h localhost -u root -p
这表示我们要登录的mysql服务器是本地的服务器,并且以root用户(mysql数据库的root用户)登录,并且使用密码。
3.2为mysql数据库用户设置密码
如果是初次启动mysql数据库,则可能出现如下错误:
niutao@niutao-desktop:/usr/share/mysql$ mysql -h localhost -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
这是因为我们还没有为mysql数据库的root用户设置密码,那么如何设置密码呢?这里提供一个网上搜索到的方法,我也使用了一下,可以:
niutao@niutao-desktop:~$ sudo /etc/init.d/mysql stop
niutao@niutao-desktop:~$sudo mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
niutao@niutao-desktop:~$mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root'; #newpassword为要设置的密码
mysql> FLUSH PRIVILEGES;
mysql> quit
niutao@niutao-desktop:~$sudo  /etc/init.d/mysql restart
niutao@niutao-desktop:~$ mysql -uroot -p
Enter password:  #输入刚才设置的密码就可以正确登录了
mysql>
3.3创建并使用数据库
3.3.1查看数据库    
我们可以使用show语句查看当前服务器上都有那些数据库:
mysql>show databases;
3.3.2创建数据库并使用
    在对数据库操作之前,我们必须创建一个数据库(如果之前没有),并且使用,使用如下命令可以创建一个数据库:
mysql>create database student;
记得其后一定要有";",表示当前sql语句结束。这样就创建了一个数据库。接下载要使用数据库:
mysql>use student;
这样我们就可以在新建的数据库student中进行创建表,修改,查询,插入等操作了。
3.3.3在数据库中创建表
mysql>CREATE TABLE pet (name VARCHAR(20), owner VARCHAR(20),
    -> species VARCHAR(20), sex CHAR(1), birth DATE, death DATE);
查看当前使用的数据库中都有那些表:
mysql>show tables;
3.3.4导入数据到数据库表中
    这里指的导入是从异构数据源中导入数据到数据库表中。比如我们现在有这样一个异构数据源:(pet.txt)
Fluffy       Harold     cat      f     1993-02-04        \N
Claws       Gwen     cat      m     1994-03-17        \N
Buffy    Harold   \N     dog      f     1989-05-13        \N
Fang    Benny    \N    dog      m     1990-08-27        \N
Bowser       Diane   dog  m     1979-08-31        1995-07-29
Chirpy       Gwen      bird  f     1998-09-11        \N
Whistler       Gwen      bird  \N  1997-12-09        \N
Slim            Benny  snake  m  1996-04-29        \N
    该数据源的每一行都是一个有效的数据信息(其中"\N"表示该列数据为空),并且对应我们之前所创建的表pet,所以就可以作为数据源导入数据库中,具体操作如下:
mysql> LOAD DATA LOCAL INFILE '/path/pet.txt' INTO TABLE pet;
第4章MYSQL数据库 C API
4.1C API简介
C API代码是与MySQL一起提供的。它包含在mysqlclient库中,并允许C程序访问数据库。
MySQL源码分发版的很多客户端是用C语言编写的。如果你正在寻找能演示如何使用C API的示例,可参看这些客户端程序。你可以在MySQL源码分发版的客户端目录下找到它们。
大多数其他客户端API(除了Connector/J和Connector/NET)采用mysqlclient库来与MySQL服务器进行通信。这意味着(例如),你可以利用很多相同环境变量(与其他客户端程序使用的环境变量相同)带来的好处,这是因为它们是从库中引用的。
客户端具有最大的通信缓冲区大小。初始分配的缓冲区大小(16KB)将自动增加到最大(最大为16MB)。由于缓冲区大小将按需增加,简单地增加默认的最大限制,从其本身来说不会增加资源使用。该大小检查主要是检查错误查询和通信信息包。
通信缓冲区必须足够大,足以包含1条SQL语句(用于客户端-服务器通信)以及1行返回的数据(用于服务器-客户端通信)。每个线程的通信缓冲区将动态增加,以处理直至最大限制的任何查询或行。例如,如果BLOB值包含高达16MB的数据,那么通信缓冲区的大小限制至少为16MB(在服务器和客户端)。客户端的默认最大值为16MB,但服务器的默认最大值为1MB。也可以在启动服务器时,通过更改max_allowed_packet参数的值增加它。
每次查询后,MySQL服务器会将通信缓冲区的大小降至net_buffer_length字节。对于客户端,不会降低与连接相关缓冲区大小,直至连接关闭为止,此时,客户端内存将被收回。
4.2数据类型
1.MYSQL
该结构代表1个数据库连接的句柄。几乎所有的MySQL函数均使用它。不应尝试拷贝MYSQL结构。不保证这类拷贝结果会有用。
2.MYSQL_RES
该结构代表返回行的查询结果(SELECT, SHOW, DESCRIBE, EXPLAIN)。
3.MYSQL_ROW
这是1行数据的“类型安全”表示。它目前是按照计数字节字符串的数组实施的。(如果字段值可能包含二进制数据,不能将其当作由Null终结的字符串对待,这是因为这类值可能会包含Null字节)。行是通过调用mysql_fetch_row()获得的。
4.MYSQL_FIELD
该结构包含关于字段的信息,如字段名、类型和大小。这里详细介绍了其成员。通过重复调用mysql_fetch_field(),可为每个字段获得MYSQL_FIELD结构。字段值不是该结构的组成部份,它们包含在MYSQL_ROW结构中。
5.MYSQL_FIELD_OFFSET
这是MySQL字段列表偏移量的“类型安全”表示(由mysql_field_seek()使用)。偏移量是行内的字段编号,从0开始。
6.my_ulonglong
用于行数以及mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()的类型。该类型提供的范围为0~1.84e19。
4.3 C API

函数

描述

mysql_affected_rows()

返回上次UPDATEDELETEINSERT查询更改/删除/插入的行数。

mysql_autocommit()

切换 autocommit模式,ON/OFF

mysql_change_user()

更改打开连接上的用户和数据库。

mysql_charset_name()

返回用于连接的默认字符集的名称。

mysql_close()

关闭服务器连接。

mysql_commit()

提交事务。

mysql_connect()

连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。

mysql_create_db()

创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。

mysql_data_seek()

在查询结果集中查找属性行编号。

mysql_debug()

用给定的字符串执行DBUG_PUSH

mysql_drop_db()

撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。

mysql_dump_debug_info()

让服务器将调试信息写入日志。

mysql_eof()

确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()mysql_error()取而代之。

mysql_errno()

返回上次调用的MySQL函数的错误编号。

mysql_error()

返回上次调用的MySQL函数的错误消息。

mysql_escape_string()

为了用在SQL语句中,对特殊字符进行转义处理。

mysql_fetch_field()

返回下一个表字段的类型。

mysql_fetch_field_direct()

给定字段编号,返回表字段的类型。

mysql_fetch_fields()

返回所有字段结构的数组。

mysql_fetch_lengths()

返回当前行中所有列的长度。

mysql_fetch_row()

从结果集中获取下一行

mysql_field_seek()

将列光标置于指定的列。

mysql_field_count()

返回上次执行语句的结果列的数目。

mysql_field_tell()

返回上次mysql_fetch_field()所使用字段光标的位置。

mysql_free_result()

释放结果集使用的内存。

mysql_get_client_info()

以字符串形式返回客户端版本信息。

mysql_get_client_version()

以整数形式返回客户端版本信息。

mysql_get_host_info()

返回描述连接的字符串。

mysql_get_server_version()

以整数形式返回服务器的版本号。

mysql_get_proto_info()

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

mysql_get_server_info()

返回服务器的版本号。

mysql_info()

返回关于最近所执行查询的信息。

mysql_init()

获取或初始化MYSQL结构。

mysql_insert_id()

返回上一个查询为AUTO_INCREMENT列生成的ID

mysql_kill()

杀死给定的线程。

mysql_library_end()

最终确定MySQL C API库。

mysql_library_init()

初始化MySQL C API库。

mysql_list_dbs()

返回与简单正则表达式匹配的数据库名称。

mysql_list_fields()

返回与简单正则表达式匹配的字段名称。

mysql_list_processes()

返回当前服务器线程的列表。

mysql_list_tables()

返回与简单正则表达式匹配的表名。

mysql_more_results()

检查是否还存在其他结果。

mysql_next_result()

在多语句执行过程中返回/初始化下一个结果。

mysql_num_fields()

返回结果集中的列数。

mysql_num_rows()

返回结果集中的行数。

mysql_options()

mysql_connect()设置连接选项。

mysql_ping()

检查与服务器的连接是否工作,如有必要重新连接。

mysql_query()

执行指定为“以Null终结的字符串”的SQL查询。

mysql_real_connect()

连接到MySQL服务器。

mysql_real_escape_string()

考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。

mysql_real_query()

执行指定为计数字符串的SQL查询。

mysql_refresh()

刷新或复位表和高速缓冲。

mysql_reload()

通知服务器再次加载授权表。

mysql_rollback()

回滚事务。

mysql_row_seek()

使用从mysql_row_tell()返回的值,查找结果集中的行偏移。

mysql_row_tell()

返回行光标位置。

mysql_select_db()

选择数据库。

mysql_server_end()

最终确定嵌入式服务器库。

mysql_server_init()

初始化嵌入式服务器库。

mysql_set_server_option()

为连接设置选项(如多语句)。

mysql_sqlstate()

返回关于上一个错误的SQLSTATE错误代码。

mysql_shutdown()

关闭数据库服务器。

mysql_stat()

以字符串形式返回服务器状态。

mysql_store_result()

检索完整的结果集至客户端。

mysql_thread_id()

返回当前线程ID

mysql_thread_safe()

如果客户端已编译为线程安全的,返回1

mysql_use_result()

初始化逐行的结果集检索。

mysql_warning_count()

返回上一个SQL语句的告警数。


阅读(5059) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~