Web数据库技术与MySQL应用教程
上QQ阅读APP看书,第一时间看更新

2.1 MySQL数据库简介

2.1.1 MySQL特点

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发。2008年1月16日MySQL被Sun公司收购,而Sun公司于2009年4月20日又被Oracle收购,因此,MySQL目前属于Oracle旗下产品。MySQL已成为目前最为流行的开源的数据库,是完全网络化的跨平台关系型数据库系统,具有以下特点。

1)提供多种存储引擎,功能强大。MySQL中提供了多种数据库存储引擎,包括MyISAM、InnoDB、BDB(BerkeleyDB)、Memory(HEAP)、Merge、Archive、Federated、Cluster/NDB、CSV、Blackhole、Example等。各种存储引擎各有所长,适用于不同的应用场合,用户可以选择最合适的引擎以得到最高性能。MySQL能够充分使用CPU资源,支持事务、视图、存储过程和触发器等,可以处理每天数亿次访问,高效完成各种任务。

2)支持跨平台,可移植性强。MySQL支持至少20种以上的开发平台,可以运行在各种版本的UNIX以及非UNIX的系统(如Windows和OS/2)上,可以运行在从家用PC到高级的企业服务器上。这使得在任何平台下编写的程序都可以进行移植,而不需要对程序做任何修改。

3)提供ODBC和JDBC等多种数据库连接途径,支持SQL和多种开发语言。MySQL可以利用SQL(结构化查询语言),也可以利用支持ODBC(开放数据库互连)和JDBC(Java数据库连接)的应用程序。

4)数据类型丰富。MySQL能够处理字符、数值、日期及多媒体数据,包括各种整数、小数、字符串、日期时间、枚举数据、集合数据、二进制数据类型。

5)数据库存储容量大。MySQL数据库的最大有效容量通常是由操作系统对文件大小的限制决定的,MySQL内部不做限制。InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间最大容量可以达到64 TB,可以轻松处理拥有上千万条记录的大型数据库。

6)运行速度快。高速是MySQL的显著特性。在MySQL中,使用了极快的“B树”磁盘表(MyISAM)和索引压缩;通过使用优化的单扫描多连接,能够极快地实现连接;MySQL函数使用高度优化的类库实现,运行速度极快。MySQL采用优化的SQL查询算法,有效地提高查询速度。MySQL在运行时占用的资源少,运行速度很快,软件的运行效率高。

7)支持多用户,安全性高。MySQL支持多用户、多处理器、多线程和互联网操作,数据一旦存入数据库,即可进行实时处理与共享,大大提高信息资源的利用率。同时,MySQL也能够确保多用户下数据库资源的安全访问和控制。MySQL由数据库管理员负责建立和管理用户,包括设置用户名、密码和操作数据库的权限。用户使用MySQL时,需要以用户名和密码登录,并在其拥有的操作权限内访问数据库。而且,灵活安全的权限和密码系统允许基于主机的验证,在连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码的安全和数据库的安全。

8)开放源代码,使用成本低。MySQL的系统程序小巧,开放源代码,任何人都可以直接从网上下载使用。MySQL软件采用了双授权政策,有社区版和商业版之分。社区版遵守GPL(General Public License,即通用性公开许可证)协议,可以免费使用,但质量和时效性无法与商业版相比;商业版提供7×24h技术支持以及定时打补丁等服务,用户需要为此支付服务费用,但价格相对低廉。

9)简单易用。MySQL是一个高性能且相对简单的数据库系统。用户可以利用MySQL命令行客户端操作界面、phpMyAdmin图形操作界面或自己编写的客户端应用程序来访问数据库。与一些更大的数据库系统的设置和管理相比,其复杂程度较低,调试、管理、优化相对简单。

MySQL也存在一些不足,例如缺乏标准的RI(Referential Integrity)机制、没有一种存储过程(Stored Procedure)语言、不支持热备份,其功能稍弱于Oracle、DB2、SQL Server等其他的大型数据库。但是,由于MySQL体积小、速度快、总体拥有成本低,尤其是开放源代码这一特点,使得许多中小型网站选择MySQL作为网站数据库。在Web应用方面,MySQL被誉为最好的关系型数据库管理系统应用软件之一。

2.1.2 MySQL数据类型

数据类型是指数据的分类。MySQL提供的数据类型包括字符串类型、数值类型、日期时间类型、复合数据类型和二进制类型。其中,常用的数据类型有字符串类型、数值类型和日期时间类型。

1.字符串类型

字符串类型的数据是用单引号或双引号括起来的,由字母、汉字、数字符号、特殊符号等组成的一串字符,例如,“张三”或'张三'是表示姓名的字符串。MySQL字符串类型包括定长字符串类型和变长字符串类型。MySQL主要支持6种字符串类型:char、varchar、tinytext、text、mediumtext和longtext。

(1)定长字符串类型

定长字符串类型是指char(n)类型,这里n为正整数,n≤255,表示想要保存的字符串值的最大字符个数,占用n个字符的存储空间。例如,字符集为gb2312,姓名的值是“张三”,若姓名的数据类型定义为char(4),则存储姓名的值时,将在实际值“张三”的右侧填充空格以达到指定的长度(4),因此会占用两个汉字和两个空格符的存储空间。这里所说的字符可以是汉字、英文字符、数字等,如果字符集为gb2312,一个汉字字符占两个字节,一个英文字符或数字占1个字节;但如果字符集为utf8,则一个汉字占3个字节,一个英文字符或数字占1个字节。

(2)变长字符串类型

varchar(n)为变长字符串类型,n的取值与字符集有关,当n的值大于或等于字符串值的字符个数时,占用的存储空间就是字符串自身占用的存储空间。例如,字符集为gb2312,姓名的值是“张三”,若姓名的数据类型定义为varchar(4),则存储姓名的值时只占用两个汉字字符的存储空间,不需要用空格填充,因此,它比char类型要节省磁盘的存储空间。

tinytext、text、mediumtext和longtext也都是变长字符串类型,容量与字符集有关,占用的字节数就是字符串实际占用字节数。

(3)MySQL模式对char(n)和varchar(n)类型的影响

MySQL在不使用严格模式运行时,如果分配给char(n)或varchar(n)类型数据的值的字符个数超过n,则对值进行裁剪以使其适合。例如,将字符集设置为gb2312,定义姓名的数据类型为char(4)或varchar(4),若姓名的值为“欧阳一二三四”,则存储姓名的值时只能保存“欧阳一二”。

注意:如果MySQL运行使用严格模式,那么,长度超过最大字符个数的值将不被保存,并且会出现错误。

在MySQL命令行客户端,使用命令“set sql_mode='strict_trans_tables';”可以开启strict mode(严格模式)选项,MySQL模式为严格的SQL模式。也可以使用“set sql_mode='';”将sql_mode的值设置为不包含任何字符的空字符串,成为非严格模式。还可以使用“set sql_mode='ansi';”将sql_mode的值设置为“ansi”模式。使用“show variables like 'sql_mode';”可以查看当前sql_mode的值。

2.数值类型

(1)整数类型

MySQL数值类型包括整数类型和小数类型。整数类型包括tinyint、smallint、mediumint、int、bigint 5种类型,它们对应的数据分别占用1、2、3、4、8个字节的存储空间,在默认情况下可表示正整数和负整数,即有符号数,其取值范围为(-2i×8/2,2i×8/2-1),其中i为各种整数类型占用的字节数。如果只希望表示0和正整数,可使用无符号关键字unsigned将整数类型修饰成无符号整数,例如num表示数量时,可以使用SQL代码片段“num tinyint unsigned”,这样表示数量的num的值就不能为负数了。无符号整数的取值范围为(0,2i×8-1),其中i为各种整数类型占用的字节数。

(2)小数类型

小数类型的数据由整数部分和小数部分组成,MySQL支持的小数类型包括定点数类型和浮点数类型。

1)定点数类型。用于保存必须为确切精度的值(小数部分的位数确定的数据),用decimal(L,D)格式表示,其中L的取值范围为1~65,表示十进制数字的总个数;D的取值范围为0~30,表示保留D位小数,且D≤L。如果数据类型指定为decimal(L,D)类型,则数据不管是正数,还是负数,其整数部分最大包括(L-D)个9,小数点后最大包含D个9。如果缺省L和D,则默认L为10,默认D为0。就是说,创建表时某字段定义为decimal类型而不带任何参数,等同于decimal(10,0)。

2)浮点数类型。包括单精度浮点数和双精度浮点数,分别用float(L,D)和double(L,D)表示。float和double中L和D的取值默认都为0,即除了最大值和最小值,不限制位数;float类型的数据占用4字节(1位符号位,8位表示指数,23位表示尾数),取值范围为-3.402823466E+38~-1.175494351E-38、0和1.175494351E-38~3.402823466E+38;double类型的数据占用8字节(1位符号位,11位表示指数,52位表示尾数),取值范围为-1.7976931348623157E+308~-2.2250738585072014E-308、0和2.2250738585072014E-308~1.7976931348623157E+308。双精度浮点数的取值范围和精度远远大于单精度浮点数,但同时会耗费更多存储空间,降低数据计算性能。

无符号关键字unsigned也可用于修饰小数。例如price表示定价字段,用SQL创建数据表时可以用“price float unsigned”来约束定价,使其不能为负数。

3.日期时间类型

MySQL主要支持5种日期时间类型:date、time、datetime、year和timestamp,这些类型的数据值需要用引号括起来。

1)date表示日期,占3字节,数据存储格式是yyyy-mm-dd,取值范围是'1000-01-01'~'9999-12-31';

2)time表示时间,占3字节,格式是hh:ii:ss,取值范围是'-838:59:59'~'838:59:59';

3)datetime表示日期和时间,占8字节,格式是yyyy-mm-dd hh:ii:ss,取值范围是'1000-01-01 00:00:00'~'9999-12-31 23:59:59';

4)year表示年份,占1字节,格式是yyyy,取值范围是'1901'~'2155';

5)timestamp表示时间戳,占4字节,格式是yyyy-mm-dd hh:ii:ss,取值范围按UTC时间是'1970-01-01 00:00:01'~'2038-01-19 03:14:07',按北京时间是'1970-01-01 08:00:01'~'2038-01-19 11:14:07'。

注意:timestamp类型具有自动初始化和自动更新的特性。将NULL插入timestamp类型的字段后,该字段的值实际上是MySQL服务器当前的日期和时间,使用MySQL命令“show variables like 'time_zone';”可以看到time_zone的值是SYSTEM,表示当前MySQL服务实例的时区与服务器主机的操作系统的时区一致。

4.复合数据类型

(1)enum枚举类型

MySQL支持的复合数据类型是指enum枚举类型和set集合类型。枚举类型使用格式是enum(值1,值2,…,值n),允许从一个集合中取得某一个值,且只能取其中一个值。例如,字符集用gb2312,“性别”字段数据的值只能是“男”或“女”之一,利用MySQL创建表的“性别”字段可用代码片段“性别enum('男','女')”。

(2)set集合类型

集合类型使用格式是set (值1,值2,…,值n),允许从一个集合中取得多个值。例如,一个人的爱好可以从{'音乐','舞蹈','文学','旅游','足球'}集合中选取若干项,则创建“爱好”字段时可以用以下MySQL代码片段:“爱好set('音乐','舞蹈','文学','旅游','足球')”。

(3)MySQL模式对复合数据类型的影响

复合数据类型的使用受MySQL模式的影响。严格模式下,赋值或执行插入操作时必须严格从所指定的集合中取值,否则操作会失败。非严格模式下,赋值或执行插入操作时,只将集合中的数据按正常操作执行,集合之外的数据会被忽略。

5.二进制类型

MySQL主要支持7种二进制类型:binary、varbinary、bit、tinyblob、blob、mediumblob、longblob。

1)binary(n)类型。n为字节数,0≤n≤255,n的值默认为1。允许保存不超过n字节的定长二进制串,占用n字节,用于存储较短的二进制数。

2)varbinary(n)类型。n为字节数,n的值不能缺省。允许保存不超过n字节的变长二进制串,占用空间为实际占用的字节数(字节数为值的长度加1),用于存储较长的二进制数。

3)bit(n)类型。用于存储bit值,1≤n≤64,n缺省时默认值为1,占用存储空间n个位(不是字节),取值范围为0~2n-1,用于存储短二进制数。例如,bit(4)就是数据类型为bit类型,长度为4,其能够存储的值为0~15,因为15变成二进制后值为1111。bit类型的数据要正确插入到数据库中,SQL语句values部分的值不能为字符串(即数字不能用引号括起来),必须为int型;在查询bit类型的数据时,要用“bin(字段名+0)”来将值转换为二进制显示;而“字段名+0”转换为相应的十进制数显示。

4)tinyblob类型。变长二进制数据,取值范围0~255字节,用于存储不超过255个字符的二进制串。

5)blob类型。变长二进制数据,取值范围为0~216-1字节,用于存储图片、声音等二进制形式的长文本数据。

6)mediumblob类型。变长二进制数据,取值范围为0~224-1字节,用于存储图片、声音、视频等二进制形式的中等长度文本数据。

7)longblob类型。变长二进制数据,取值范围为0~232-1字节,用于存储图片、声音、视频等二进制形式的极大文本数据。

6.数据类型的选择

选择合适的数据类型,通常可以有效节省存储空间和提升数据的计算性能。选择数据类型可以遵循以下原则:

1)认真分析数据所属类型,以便对号入座,不要将数据定义为不正确的类型;

2)在满足取值范围和精度要求的前提下,尽量使用“短”数据类型,例如优先选用char(n)和varchar(n)类型存储字符串数据,长度不够时选用text类型;

3)尽量用内置的日期和时间类型,而不用字符串来存储日期和时间;

4)尽量避免NULL字段,建议将字段指定为NOT NULL约束,推荐使用0、一个特殊值或者一个空字符串代替NULL值,以利于查询优化。