NOVOTS KMS 词汇表 Glossary    联系我们 Contact Us
查询 Search  
   
按类别浏览 Browse by Category
NOVOTS KMS .: 数据库 .: MySQL入门及初步

MySQL入门及初步

 

 

 

 

 

MySQL入门与初步

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 


本章要点:

v  MySQL标准简介

v  关系数据库系统的知识

v  MySQL的优点

v  MySQLSQL语言

MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。MySQLUNIX等操作系统上是免费的,在Windows操作系统上,可免费使用其客户机程序和客户机程序库。

MySQL是一个精巧的SQL数据库管理系统,虽然它不是开放源代码的产品,但在某些情况下你可以自由使用。由于它的功能强大、使用简便、管理方便、运行速度快、安全可靠性强、灵活性、丰富的应用编程接口(API)以及精巧的系统结构,受到了广大自由软件爱好者甚至是商业软件用户的青睐,特别是与ApachePHP/PERL结合,为建立基于数据库的动态网站提供了强大动力。

 

 

 

 

 

 

 

 

 

1.1  MySQL简介

MySQL的进展是非常快了,越来越多的领域里都可以见到MySQL的身影,在学习如何使用这个强大的系统之前,我们首先要了解MySQL的历史、功能、特点,你会对学习MySQL更具信心。

在正式开始之前,我们现了解一下它的读音。MySQL的官方发音是“My Ess Que Ell(不是 MY-SEQUEL )

1.1.1 MySQL是什么?

MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。

SQL是一种标准化的语言,它使得存储、更新和存取信息更容易。例如,你能用SQL语言为一个网站检索产品信息及存储顾客信息,同时MySQL也足够快和灵活以允许你存储记录文件和图像。

MySQL 主要目标是快速、健壮和易用。最初是因为我们需要这样一个SQL服务器,它能处理与任何可不昂贵硬件平台上提供数据库的厂家在一个数量级上的大型数据库,但速度更快,MySQL就开发出来。自1996年以来,我们一直都在使用MySQL,其环境有超过 40 个数据库,包含 10,000个表,其中500多个表超过7百万行,这大约有100 个吉字节(GB)的关键应用数据。

MySQL建立的基础是业已用在高要求的生产环境多年的一套实用例程。尽管MySQL仍在开发中,但它已经提供一个丰富和极其有用的功能集。

MySQL 最早起始于 1979 年,开始是 Michael Monty Widenius 为瑞典的 TcX 公司创建的 UNIREG 数据库工具。1994 年,TcX 开始寻找一个用来开发 Web 应用程序的 SQL 服务器。他们测试了一些商业服务器,但是发现所有服务器对于 TcX 的大型表来说都太慢。他们也试了 mSQL,但它缺乏 TcX 需要的某些功能。因此,Monty 开始开发一种新的服务器。其编程接口明确地设计为类似 mSQL 的编程接口,因为 mSQL 可得到几个免费的工具,所以利用与 mSQL 类似的接口,可以将这些相同的工具用于MySQL 从而大大减少了开发接口的工作。

1995 年,Detron HB公司的 David Axmark 努力争取 TcX公司在因特网上发布 MySQLDavid 还做了文档资料方面的工作和使 MySQL GNU 的配置实用程序一起建造的工作。MySQL 3.11.1 1996 年以用于 Linux Solaris 系统的二进制分发形式发布。今天,MySQL 正工作在许多平台上,并且二进制和源代码的形式都可以得到。

MySQL 并不是一个开放源代码的产品,因为在某些条件下使用它需要许可证。但是,MySQL 很愿意在开放源代码的团体内得以普及,因为“认证”这个术语并不是非常有约束力的(除非通过出售 MySQL 或出售需要它的服务来挣钱,否则,大体上说 MySQL 一般是免费的)。

MySQL 的普及并不限于开放源代码团体内。虽然它在个人计算机上运行(确实,MySQL 的开发一般在不昂贵的 Linux 系统上进行),但它是可移植的,并且运行在商用操作系统(如 SolarisIrix Windows)和一直到企业服务器的各种硬件上。此外,它的性能也足以和任何其他系统相匹敌,而且它还可以处理具有数百万个记录的大型数据库。

MySQL 的广泛应用前景在我们面前尚未完全展开,如运行在功能强但不昂贵的硬件上的免费可用操作系统,将丰富的处理功能和能力提供给比以往更多的人,在比过去范围更广的系统上运行等等。信息处理的经济障碍的降低使强有力的数据库解决方案到达了比过去任何时候更多的人和机构的手中。例如,本人在运行 LinuxPPC G3 PowerBook 笔记本电脑上使用 MySQL PerlApache PHP,这允许本人在任何地方都可以进行工作,总的成本只是 PowerBook 的成本。

过去只能梦想将高性能的 RDBMS 用于自己工作的机构,现在可以这样做了,并且开销很低。数据库的利用在单一的层次上也在不断地增加。过去从未想过要使用数据库的人现在也开始考虑一旦得到一个数据库,怎样将其用于自己的各种目的,例如用来存储和访问系统的研究结果,跟踪和维护最喜爱的收藏物(蝴蝶、邮票、捧球明星卡等等),帮助管理新开张的公司,或者提供个人 Web 站点的搜索能力。

1.1.2 我需要MySQL?

如果您正在寻找一种免费的或不昂贵的数据库管理系统,可以有几个选择,如,MySQLmSQLPostgres(一种免费的但不支持来自商业供应商引擎的系统)等。在将 MySQL 与其他数据库系统进行比较时,所要考虑的最重要的因素是性能、支持、特性(与 SQL 的一致性、扩展等等)、认证条件和约束条件、价格等。相比之下,MySQL 具有许多吸引人之处:

1、速度。MySQL 运行速度很快。开发者声称 MySQL 可能是目前能得到的最快的数据库。可访问 http://www.mysql.com/benchmark.html MySQL Web 站点上的性能比较页),调查一下这个性能。

2、容易使用。MySQL 是一个高性能且相对简单的数据库系统,与一些更大系统的设置和管理相比,其复杂程度较低。

3、价格。MySQL 对多数个人用户来说是免费的。详细的信息请参阅本前言后面的 MySQL是否免费”一节。

4、支持查询语言。MySQL 可以利用 SQL(结构化查询语言),SQL 是一种所有现代数据库系统都选用的语言。也可以利用支持 ODBC(开放式数据库连接)的应用程序,ODBC Microsoft 开发的一种数据库通信协议。

5、性能。许多客户机可同时连接到服务器。多个客户机可同时使用多个数据库。可利用几个输入查询并查看结果的界面来交互式地访问 MySQL。这些界面为:命令行客户机程序、Web 浏览器或 X Window System 客户机程序。此外,还有由各种语言(如 CPerlJavaPHP Python)编写的界面。因此,可以选择使用已编好的客户机程序或编写自己的客户机应用程序。

6、连接性和安全性。MySQL 是完全网络化的,其数据库可在因特网上的任何地方访问,因此,可以和任何地方的任何人共享数据库。而且 MySQL 还能进行访问控制,可以控制哪些人不能看到您的数据。

7、可移植性。MySQL 可运行在各种版本的 UNIX 以及其他非 UNIX 的系统(如 Windows OS/2)上。MySQL 可运行在从家用 PC 到高级的服务器上。

如果,你对上面的特性非常在意,尤其是价格和速度、性能方面,那么我认为MySQL十分适合你。

1.1.3 我需要付钱吗?

基本上,我们许可证政策如下: 

对于一般的内部使用,MySQL通常是免费的。如果你不想,就不必付钱给我们。 

一个许可证是必需的,如果:

你直接销售MySQL服务器或作为其他产品或服务的一部分; 

你在某些客户那里为了安装和维护一个 MySQL 服务器而收费; 

你在不可再分发的分发中包括 MySQL并且你对该分发的某些部分收费; 

在必须有 MySQL 许可证的情况下,对每台运行mysqld服务器的机器,你都需要一个许可证,但多CPU机器按单CPU计算,并且在一台机器上运行 MySQL 服务器的数量或并发连接到这台运行一个服务器的机器的客户数量也无限制! 

你在商业程序中包含客户代码不需要一个许可证,MySQL的客户端存取部分不属公共领域,mysql命令行客户程序包含在 GNU 通用许可证下的 readline 库的代码。 

对于已经购买了 10 个许可证或一种足够级别的技术支持的消费者,我们提供附加的功能。目前,这意味着我们提供 myisampack实用工具,它能生成快速的压缩的只读数据库(服务器支持读取这样的数据库,但不包含用于生成它们的压缩工具)。当支持协议产生了足够的收入时,我们将在与MySQL 服务器同样的许可证下发行这个工具。 

如果你使用不需要一个许可证的 MySQL,但是你的确喜欢 MySQL 并且有志于更进一步的开发,无论如何肯定欢迎你购买一个许可证。 

如果你在一个商业环境中使用 MySQL以便通过它获利,我们要求你购买一定级别的技术支持以推进开发。我们感到,如果 MySQL 有助于你的业务,要求你帮助MySQL也是合理的(否则,如果向我们你询问支持问题,你不仅是正在免费使用我们倾注大量精力的产品,而且你正在要求我们提供免费的支持。)。 

对于在微软操作系统下面( Win95/Win98/WinNT)的使用,你在一个 30 天的试用期后需要一个 MySQL 许可证,除了教育用途或大学或政府资助的研究机构的许可证可免费申请获得,见 K 针对微软操作系统的 MySQL 许可证。一个共享软件版本的 MySQL -Win32 可在购买前从 http://www.mysql.com/mysql_w32.htmy 下载试用。在你付钱后,你将得到一个口令让你能够访问最新 MySQL - Win32 版本。

如果你需要一个 MySQL 许可证,最容易的付款方法是使用在 https://www.mysql.com/license.htmy网站的 Tcx 的安全服务器上的许可证表格。

1.1.4 如何得到MySQL?

在本小节读者不仅讲知道如何得到MySQL还将知道如何得到与MySQL有关的很多软件,虽然由于篇幅和本书写作目的的原因,我们不可能一一介绍它们:

TcX公司的MySQL网站上http://www.mysql.com/doc.html你可以得到大部分需要的软件包:

MySQL分发包(包括各种平台——WindowsLinux等——,各种形式——二进制、源代码、RPM包——的分发),现在已经有适用GPL许可证的MySQL分发,请仔细阅读最新的许可信息。

MySQL 用于ODBC驱动程序MyODBC

MySQLJDBC驱动程序mm.mysql

PHP写成的客户程序phpMyAdmin

以及其它各种第三方客户机。

 

获得Active Perl

http://www.activestate.com/

获得Perl DBI

http://www.symbolstone.org/technology/perl/DBI

获得PHP

www.php.net

获得Apache

http://www.apache.org

1.1.5总结

本节简单介绍的MySQL的方方面面,相信读者对MySQL已经有了一定的了解了。看看你是不是了解了它:

l  MySQL是一个关系数据库系统,支持SQL查询语言。

l  MySQL可以是免费的,你不需要为它付费。

l  MySQL系统的速度非常快,同样它的性能也是十分优良的。

l  MySQL是一个管理简捷的数据库,它没有庞大而臃肿的可视化管理工具。

1.2 关系数据库管理系统

在过去的许多年里,有许多关于“数据库”这个名词的定义。数据库是一个服务于一个核心目标的数据的有组织的集合。数据库中的数据是有组织的,从某种意义上说,数据库中存储的数据采用一种不变的方式被存储、格式化、存取以及显示。因为数据库不含有无关的或冗余的数据,它可以适用于一个核心目标。一本电话簿就是一个很好的数据库例子,它包含有关的数据(名字),让人们能够查找电话号码;它不包含无关的数据,如某人的电话机的颜色;它只贮存那些与它的目标相关的信息。最常见的,一个数据库的目标是商务应用,但是也可能贮存科学、军事或其他数据,这些数据通常不能当作商务数据看待。因此,有商业数据库、科学数据库、军事数据库以及其他的数据库等等。另外,数据不仅能根据它的应用分类,还能根据它的格式分类,现代数据库包括多种类型的数据。例如,现在数据库贮存图像、图表、声音、视频或包括两种或多种类型的复合文档,已经是很普通的事了。

1.2.1 关系数据库系统

所谓RDBMS,即关系数据库管理系统,

为了进一步了解一个RDBMS 是由什么构成的,你必须先了解关系模型。下列情况出现在一个关系模型中:

l  数据的基础项是关系。

l  在这些表上的操作只产生关系(关系型闭合)。

什么是关系?这是一个描述两个集合的元素如何相互联系或如何一一对应的数学概念。因此,关系模型是建立在数学基础上的。然而,对你来说,关系只是一个带有一些特殊属性的表,一个关系模型把数据组织到表中,而且仅在表中。客户、数据库设计者、数据库系统管理员和用户都以同样的方式—即从表中—查看数据。那么,表就是关系模型的近义词。

一个关系型表有一组命名的属性(a t t r i b u t e )或列,以及一组元组(t u p l e )或行。有时列被称为域,行被称为记录,列和行的交集通常被叫做单元。列标示位置,有作用域或数据类型,例如字符或整数。行自己就是数据。

一个关系表必须符合某些特定条件,才能成为关系模型的一部分:

1、贮存在单元中的数据必须是原子的。

每个单元只能存贮一条数据,这也叫信息原则(Information Principle )。尽管在过去的数年中按某些违反这一条的方式已经建立了许多系统,但违反这一条将不能运用良好的设计原则。当一个单元包含多于一条的信息时,这叫做信息编码(information coding )。在这样的情况下,是否采用违背理论的方案是一个设计的选择问题,尽管在多数情况下,结果证明这对数据的完整性是一不利的。

2、贮存在列下的数据必须具有相同数据类型。

3、每行是唯一的(没有完全相同的行)。

4、列没有顺序。

5、行没有顺序。

6、列有一个唯一性的名称。

除了表和它们的属性,关系模型有它自己特殊的操作。不需要深入研究关系型数学,只需说明这些操作可能包括列的子集、行的子集、表的连接以及其他数学集合操作(如联合)等就足够了。真正要知道的事情是这些操作把表当作输入,而将产生的表作为输出。

S Q L 是当前R D B M S A N S I 标准语言,它包含这些关系型操作。允许数据操作或数据处理的主要语句是S E L E C T I N S E RT U P D AT E D E L E T E 。因此,这些数据处理操作中任何一个都是一个事务。

允许数据定义或结构化处理的基本语句是C R E AT E A LT E R D R O P 。关系模型要求的最后一件事是两个基础的完整性原则。它们是实体完整性原则(e n t i t y integrity rule )和引用完整性原则(referential integrity rule )。首先,让我们看看两个定义:

1、主键(primary key )是能唯一标识行的一列或一组列的集合。有时,多个列或多组列可以被当作主键。

2、由多个列构成的主键被称为连接键(concatenated key )、组合键(compound key ),或者更常称为复合键(composite key )。

数据库设计者决定哪些列的组合能够最准确和有效地反映业务情形,这并不意味着其他数据未被存贮,只是那一组列被选作主键而已。

剩余有可能被选为主键的列被叫做候选键(candidate key )或替代键(alternate key )。一个外键(foreign key )是一个表中的一列或一组列,它们在其他表中作为主键而存在。一个表中的外键被认为是对另外一个表中主键的引用。实体完整性原则简洁地表明主键不能全部或部分地空缺或为空,引用完整性原则简洁地表明一个外键必须为空或者与它所引用的主键当前存在的值相一致。

一个R D B M S 就是一个建立在前面这些关系模型基础上的,一般能满足所提到的全部要求

D B M S 。但是,在7 0 年代末到8 0 年代初,R D B M S 开始销售的时候,S Q L 超越了本质为非关系型的系统,受到普遍欢迎,并被称作关系型。

1.2.2 数据库系统的发展

1969年美国的IBM公司开发了第一个数据库系统IMS。这是一个层次数据库系统,在数据库系统发展史上有着重要的地位。同年,美国的数据系统语言委员会(CODASYL)下属的数据库任务组提出了著名的DBTG报告,并在1970年提出了该报告的修订版。这份报告定义了数据库操纵语言、模式定义语言和子模式定义语言的概念。数据库操纵语言用于编写操纵概念视图的应用程序,模式定义语言用来编写概念视图和内部视图相结合的模式程序。在七十年代,开发了许多遵循DBTG报告的网状数据库系统,如:IDMS, IDS, DMSIIOO等。七十年代初,E.F.Codd提出了关系数据模型的概念,提出了关系代数和关系演算。在整个七十年代,关系数据库从理论到实践都取得了辉煌成果。在理论上,确立了完整的关系理论、数据依赖理论以及关系数据库的设计理论等等;在实践上,开发了许多著名的关系数据库系统,如:system R, INGRES, ORACLE等。1986年美国国家标准协会(ANSI)通过了关系数据库查询语言SQL的文本标准。进入八十年代以后,随着计算机硬件技术的提,使得计算机应用不断深入,产生了许多新的应用领域,如:计算机辅助设计、计算机辅助教学、计算机辅助制造、计算机辅助工程、计算机集成制造、办公自动化、地理信息处理、智能信息处理等等。这些新的应用领域对数据库系统提出了新要求。由于没能设计出一个统一的数据模型来表示这些新型数据及其相互联系,所以出现了百家争鸣的局面,产生了演绎数据库(逻辑数据库,知识库)、面向对象数据库、工程数据库、时态数据库、地理数据库、模糊数据库、积极数据库、…等新型数据库的研究。到八十年代后期和九十年代初期,出现了面向对象数据库系统,如:GemStone, VBASE, ORION, Iris等。到目前为止,真正的新一代数据库系统还没有出现。

1.2.3 与数据库系统通讯

结构化查询语言(Structured Query Language SQL)是当今主要的查询语言,它主要用于管理主流类型的D B M S —关系型D B M S R D B M S )。所有与数据库相关的通信往来都将通过D B M S 完成,为了做这件事,你可以使用S Q L 或其他类似的东西。数据库系统管理员(D B A )使用查询语言来建立并维护数据库,用户使用查询语言来访问数据库并查看或更改数据。

1.2.4 MySQL的体系结构

因为 MySQL 采用的是客户机/服务器体系结构,所以你在使用 MySQL 时存取数据时,必须至少使用两个或者说两类程序:

1、一个位于存放您的数据的主机上的程序——数据库服务器。数据库服务器监听从网络上传过来的客户机的请求并根据这些请求访问数据库的内容,以便向客户机提供它们所要求的信息。

2、连接到数据库服务器的程序——客户机,这些程序是用户和服务器交互的工具,告诉服务器需要什么信息的查询。

MySQL 分发包包括服务器和几个客户机程序。可根据要你要达到的目的来选择使用客户机。最常用的客户机程序为 mysql,这是一个交互式的客户机程序,它能发布查询并看到结果。其他的客户机程序有: mysqldump mysqlimport,分别导出表的内容到某个文件或将文件的内容导入某个表;mysqladmin 用来查看服务器的状态并完成管理任务,如告诉服务器关闭、重起服务器、刷新缓存等。如果具有现有的客户程序不满足你的需要,那么MySQL还提供了一个客户机编程库,可以编写自己的程序。客户机编程库可直接从 C 程序中调用,如果希望使用 C 语言以外的其他语言,还有几种其他的接口可用。

MySQL 的客户机/服务器体系结构具有如下优点:

1、服务器提供并发控制,使两个用户不能同时修改相同的记录。所有客户机的请求都通过服务器处理,服务器分类辨别谁准备做什么,何时做。如果多个客户机希望同时访问相同的表,它们不必互相裁决和协商,只要发送自己的请求给服务器并让它仔细确定完成这些请求的顺序即可。

2、不必在数据库所在的机器上注册。MySQL 可以非常出色的在因特网上工作,因此您可以在任何位置运行一个客户机程序,只要此客户机程序可以连接到网络上的服务器。

当然不是任何人都可以通过网络访问你的MySQL服务器。MySQL 含有一个灵活而又有成效的安全系统,只允许那些有权限访问数据的人访问。而且可以保证用户只能够做允许他们做的事。

1.2.5总结

本节简单介绍了一下关系数据库系统的基础知识,真正要详尽描述数据库系统的理论,完全可以写成几本书。读完本节之后,笔者希望读者能够了解什么是关系模型、SQL语言以及MySQL的系统结构,这不仅对继续阅读本书有利,也可以在读者获取相关知识时,起到一个启发的作用。

1.3 MySQL使用的SQL语言

MySQL使用结构化查询语言(Structured Query LanguageSQL)与服务器通讯。MySQL系统使用的SQL语言基本上符合SQL92的标准,但是其对SQL92标准既有扩展,又有未实现的地方。

1.3.1 表、列和数据类型

表是数据在一个MySQL数据库中的存储机制,如表1-1所示,它包含一组固定的列。表中的列描述该表所跟踪的实体的属性,每个列都有一个名字及各自的特性。

列由两部分组成:数据类型(datatype)和长度(length)。对于使用NUMERIC 数据类型的列,可以指定列的小数位及精度特性,精度决定数值的有效位数,小数位表示数值的小数点位置。说明为NUMERIC(9,2)的列表示该列总共有9位数,其中2位数在小数点右边。缺省的数值精度为10位数。

1-1  一个数据表techers

Id

Name

Tel

Sex

1

Tom

62763218

M

2

Marry

21532777

F

3

Mike

45769021

M

4

Jerry

3245012

M

 

注意,在上表中你可能会有每行记录是按顺序记录的印象,假设你想取出表中的前十个记录。使用传统的编程语言,你可以做一个循环,取出前十个记录后结束循环。但使用标准的SQL查询,这是不可能实现的。因为在关系数据模型中,记录就是行是没有顺序的,也就是说,在一个表中不存在前十个记录这种概念。

1.3.2函数

函数(function)是存储在数据库中的代码块。其差别在于函数可以把值返回调用程序。你可以建立自己的函数,并在SQL语句中调用它们,就像执行Oracle提供的函数一样。例如,MySQL提供一个SUBSTRING函数来执行字符串上的“取子串”操作,如果创建一个叫做MYSUB的函数来执行一个自定义的取子串操作,就可以在一个SQL命令中调用它:

SELECT MYSUB("This is a test",6,2)

1.3.3 SQL的语句

SQL是一种典型的非过程化程序设计语言,这种语言的特点是:只指定哪些数据被操纵,至于对这些数据要执行哪些操作,以及这些操作是如何执行的,则未被指定。非过程化程序设计语言的优点在于它的简单易学,因此已经成为关系数据库访问和操纵数据的标准语言。 

与之相对应的是过程化程序设计语言,我们平常熟悉的各种高级程序设计语言都属于这一范畴。这种语言的特点是:一条语句的执行是与其前后的语句和控制结构(如条件语句、循环语句等)相关的。与SQL相比,这些语言显得比较复杂,但优点是使用灵活,数据操纵能力非常强大。

这种语言被设计为不允许你按照某种特定的顺序来取出记录,因为这样做会降低SQL Sever取记录的效率。使用SQL,你只能按查询条件来读取记录。 

当考虑如何从表中取出记录时,自然会想到按记录的位置读取它们。例如,也许你会尝试通过一个循环,逐个记录地扫描,来选出特定的记录。在使用SQL时,你必须训练自己,不要有这种思路。 

假如你想选出所有的名字是“Tom”的记录,如果使用传统的编程语言,你也许会构造一个循环,逐个查看表中的记录,看名字域是否是“Tom”。 

这种选择记录的方法是可行的,但是效率不高。使用SQL,你只要说,“选择所有名字域等于Tom的记录”,SQL就会为你选出所有符合条件的记录。SQL会确定实现查询的最佳方法。

例如,我们从表1-1中取出id1的数据:

SELECT * FROM teachers WHERE id=1

相同的功能用普通的高级语言,也许需要一个复杂的循环。

1.3.4总结

在这一节中,简单介绍了SQL查询语言的基本知识,对于列数据类型、SQL的各种语句,将在以后的章节中介绍,这是一个很长的过程。

1.4 MySQL数据处理

MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。

1.4.1 MySQL的数据

MySQL有几种数据类型,你应该了解它们是怎么使用的:

1.4.1.1、字符串值

字符串是类似”I like mysql.”’MySQL is powerful.’等这样的值,它们既可以用双引号括起来,也可以是用单引号。

在字符串中不仅可以使用普通的字符,也可使用几个转义序列,它们用来表示特殊的字符,见表 1-2。每个转义序列以一个反斜杠(“\”)开始,指出后面的字符使用转义字符来解释,而不是普通字符。注意 NUL 字节与 NULL 值不同;NUL 为一个零值字节,而 NULL 代表没有值。

1-2  字符串转移序列表

序列

涵义

\0

一个ASCII 0 (NUL)字符

\n

一个新行符

\r

一个回车符(Windows中使用\r\n作为新行标志)

\t

一个定位符

\b

一个退格符

\’

一个单引号(')

\”

一个双引号(")

\\

一个反斜线(\)

\%

一个“%”符。它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符

\_

一个“_”符。它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符

现在需要注意的是,如何在串中使用引号,你可以有多种办法:

l  如果串是用相同的引号括起来的,那么在串中需要引号的地方重复写该引号即可。

l  如果串是用另外的引号括起来的,则不需要双写相应引号,直接在串中使用,该引号不被特殊对待。

l  使用反斜杠,用转移序列的方式表示;这种方法不去管用来将串括起的是单引号还是双引号。

例如,下面语句的结果是:

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';

+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

1.4.1.2数字值

MySQL中的数字是类似于1003.1215936这样的值。MySQL 支持说明为整数(无小数部分)或浮点数(有小数部分)的值:

l  整数由数字序列组成。浮点数由一个阿拉伯数字序列、一个小数点和另一个阿拉伯数字序列组成。两个阿拉伯数字序列可以分别为空,但不能同时为空。

l  MySQL 支持科学表示法。科学表示法由整数或浮点数后跟“e”或“E”、一个符号(“+”或“-”,必须具有)和一个整数指数来表示。

l  数值前可放一个负号“-”以表示负值。

例如,下面都是合法的数值:

整数值:1221  0  -32

 

浮点数:294.42  -32032.6809e+10  148.

下面的值是错误的:

1.34E12

1.4.1.3十六进制值

MySQL支持十六进制值。以十六进制形式表示的整数由“0x”后跟一个或多个十六进制数字(”0”到“9”及“a”到“f”)组成。例如,0x0a 为十进制的 10,而 0xffff 为十进制的 65535。十六进制数字不区分大小写,但其前缀“0x”不能为“0X”。即 0x0a 0x0A 都是合法的,但 0X0a 0X0A 不是合法的。

在数字上下文,它们表现类似于一个整数(64位精度)。在字符串上下文,它们表现类似于一个二进制字符串,这里每一对十六进制数字被变换为一个字符。 

例如:

mysql> select 0x5061756c+0, 0x5061756c;

其结果为:

+--------------+------------+
| 0x5061756c+0 | 0x5061756c |
+--------------+------------+
|   1348564332 | Paul       |
+--------------+------------+

 

1.4.1.4日期和时间值

日期和时间值是一些类似于“1999-06-17”或“12:30:43”这样的值。MySQL 还支持日期/时间的组合,如“1999-06-17 12:30:43”。

需要要特别注意的是,MySQL 是按年--日的顺序表示日期的。这可能与你学过的高级语言不同。

1.4.1.4 NULL

NULL值可适用于各种列类型,它通常用来表示“没有值”、 “无数据”等意义,并且不同于例如数字类型的0为或字符串类型的空字符串。

1.4.2列类型概述

数据库中的每个表都是由一个或多个列构成的。可以用 CREATE TABLE 语句创建一个表,创建表时要为每列指定一个类型。列的类型与数据类型相对应,但是比数据类型更为具体,用列类型描述表列可能包含的值的种类以及范围,列的值必须符合规定,不能包含对应的数据类型所允许的所有值。例如,CHAR16)就规定了存储的字符串值必须是16位。当然不是你必须存储16个字符,而是指列在表中要占16个字符的宽度的。

MySQL的列类型是一种手段,通过这种手段可以描述一个表列包含什么类型的值,这又决定了 MySQL 怎样处理这些值。例如,数值值既可用数值也可用串的列类型来存放,但是根据存放这些值的类型,MySQL 对它们的处理将会有些不同。每种列类型都有几个特性如下:

l  其中可以存放什么类型的值。

l  值要占据多少空间,以及该值是否是定长的(所有值占相同数量的空间)或可变长的(所占空间量依赖于所存储的值)。

l  该类型的值怎样比较和存储。

l  此类型是否允许 NULL 值。

l  此类型是否可以索引。

下面是创建一个表的例子:

CREATE TABLE teacher

(

id TINYINT UNSIGNED NOT NULL,

name CHAR(16) NOT NULL,

tele NUMERIC(8),

sex ENUM("F","M") DEFAULT "M"

)

由上面这个例子可以知道,创建列类型的语法是:

col_name col_type [col_attributes][general_attributes]

l  col_name 列的名字

l  col_type 列类型,控制存储在列中的数据类型

l  col_attributes 专用属性,只能应用于制定列,例如,我们还不知道的BINARY。如果你使用专用属性,必须在列的类型之后,列的通用属性之前。

l  general_attributes通用属性,可以应用在出少数列的任意列,例如上面提到了NULLNOT NULL、和DEFAULT

我们将简要地考察一下 MySQL列类型以获得一个总的概念,然后更详细地讨论描述每种列类型的属性。

MySQL的数字类型如表1-3所示,可以包括浮点类型和整数类型:

1-3  MySQL的数字列类型

类型名

涵义

TINYINT

一个很小的整数

SMALLINT

一个小整数

  MEDIUMINT

一个中等大小整数

  INTINTEGER

一个正常大小整数

  BIGINT

一个大整数

  FLOAT

一个小(单精密)浮点数字

  DOUBLE

DOUBLE  PRECISION

REAL

一个正常大小(双精密)浮点数字

  DECIMAL

NUMERIC

一个未压缩(unpack)的浮点数字,“未压缩”意味着数字作为一个字符串被存储

 

MySQL的字符串类型如表1-4所示,串类型中不仅可以存储字符串,实际上任何二进制数据,例如,图象、音频、视频等,都可以存储在串类型中。

1-4  MySQL的字符串列类型

类型名

涵义

CHAR

一个定长字符串

VARCHAR

一个变长字符串

  TINYBLOB

TINYTEXT

最大长度为255(2^8-1)个字符的BLOBTEXT

  BLOB

TEXT

最大长度为65535(2^16-1)个字符的BLOBTEXT

  MEDIUMBLOB

MEDIUMTEXT

最大长度为16777215(2^24-1)个字符的BLOBTEXT

  LONGBLOB

LONGTEXT

最大长度为4294967295(2^32-1)个字符的BLOBTEXT

ENUM('value1','value2',...)

枚举:列只能赋值为某个枚举成员或NULL

SET('value1','value2',...)

集合:列可以赋值为多个集合成员或NULL

 

MySQL的日期与时间类型如表1-5所示。MySQL允许你存储某个“不严格地”合法的日期值,例如1999-11-31,原因我们认为它是应用程序的责任来处理日期检查,而不是SQL服务器。为了使日期检查更“快”,MySQL仅检查月份在0-12的范围,天在0-31的范围。

1-5  MySQL的时间和日期列类型

类型名

涵义

DATE

一个日期,以'YYYY-MM-DD'格式来显示

TIME

一个日期和时间组合,以'YYYY-MM-DD HH:MM:SS'格式来显示

DATETIME

最大长度为255(2^8-1)个字符的BLOBTEXT

TIMESTAMP

一个时间戳,

YYYMMDDHHMMSS格式来显示

1.4.3 数字列类型 

MySQL支持所有的ANSI/ISO SQL92的数字类型。这些类型包括准确数字的数据类型(NUMERIC, DECIMAL, INTEGER,SMALLINT),也包括近似数字的数据类型(FLOAT, REAL,DOUBLE PRECISION)。关键词INTINTEGER的一个同义词,而关键词DECDECIMAL一个同义词。

MySQL的数字列类型有两种:

l  整型 MySQL提供了五种整型TINYINTSAMLLINTMEDIUMINTINTBIGINT。整数列可以用UNSIGNED禁用负数值。

l  浮点型 MySQL提供了三种浮点型,FLOATDOUBLEDECIMAL

下面,我们将详细描述数字类型的定义,取值范围和存储要求。

1.4.3.1整数类型

MySQL支持所有的ANSI/ISO SQL92的数字类型,其中的整数类型为INTEGER,SMALLINT,关键词INTINTEGER的一个同义词:

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]   

取值范围:有符号:-3276832767-215215-1)无符号:0655350216-1

存储要求:2个字节

INT[(M)] [UNSIGNED] [ZEROFILL]INTEGER[(M)] [UNSIGNED] [ZEROFILL]

取值范围:有符号:-21474836482147483647-231231-1)无符号:0429496729502321     

存储要求:4个字节

作为对ANSI/ISO SQL92标准的扩展,MySQL也支持上表所列的整型类型TINYINTMEDIUMINTBIGINT

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

取值范围:有符号:-128127-27271)无符号:0255028-1

存储要求:1个字节

MEDIUMINT[(M)]       [UNSIGNED] [ZEROFILL]

取值范围:有符号:-83886088388607-223223-1)无符号:01677721502241     

存储要求:3个字节

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

取值范围:有符号:-92233720368547758089223372036854775807-263263-1)无符号:01844674407370955161502641

存储要求:    8个字节

在为列选择了使用某种数值类型时,除了要考虑数据的类型外,还应该注意所要表示的值的范围和存储需求,只需选择能覆盖要取值的范围的最小类型即可。选择较大类型会对空间造成浪费,使表不必要地增大,处理起来没有选择较小类型那样有效。对于整型值,如果数据取值范围较小,则TINYINT最合适。MEDIUMINTINT虽然能表示能够表示更大的数值并且可用于更多类型的值,但存储代价更大。BIGINT 在全部整型中取值范围最大,而且需要的存储空间是表示范围次大的整型 INT 类型的两倍,因此只在确实需要时才用。

作为对ANSI/ISO SQL92标准的的另一个扩展, MySQL支持可选地指定一个整型值显示的宽度,用括号跟在基本关键词之后(例如,INT(4))。这个可选的宽度指定被用于其宽度小于列指定宽度的值得左填补显示,但是不限制能在列中被存储的值的范围;如果某个特定值的可打印表示需要不止 M 个字符,则显示完全的值;不会将值截断以适合 M 个字符。当与可选的扩展属性ZEROFILL一起使用时,缺省的空格填补用零代替。例如,对于声明为INT(5) ZEROFILL的列,一个为4的值作为00004被检索。如果定义了一个没有明确宽度的整数列,将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度。

我们可以这样知道MD的缺省值。先创建一个表

CREATE TABLE number

(

       tiny TINYINT,u_tiny TINYINT UNSIGNED,

       small SMALLINT,u_small SMALLINT UNSIGNED,

       medium MEDIUMINT,u_medium MEDIUMINT UNSIGNED,

       num INT,u_num INT UNSIGNED,

       big BIGINT,u_big BIGINT UNSIGNED

)

然后显示这个表的结构

DESCRIBE number

MySQL3.23上的结果如下:

+----------+-----------------------+
| Field    | Type                  |
+----------+-----------------------+
| tiny     | tinyint(4)            |
| u_tiny   | tinyint(3) unsigned   |
| small    | smallint(6)           |
| u_small  | smallint(5) unsigned  |
| medium   | mediumint(9)          |
| u_medium | mediumint(8) unsigned |
| num      | int(11)               |
| u_num    | int(10) unsigned      |
| big      | bigint(20)            |
| u_big    | bigint(20) unsigned   |
+----------+-----------------------+

1.4.3.2浮点数类型

MySQL支持所有的ANSI/ISO SQL92的浮点数字类型。这些类型包括准确数字的数据类型(NUMERIC, DECIMAL),也包括近似数字的数据类型(FLOAT, REAL,DOUBLE PRECISION)。关键词DECDECIMAL一个同义词:

FLOAT[(M,D)] [ZEROFILL]      

取值范围:-3.402823466E+38-1.175494351E-380 1.175494351E-383.402823466E+38  

存储要求:4个字节

DOUBLE[(M,D)] [ZEROFILL]DOUBLE PRECISION[(M,D)]     [ZEROFILL]

取值范围:-1.7976931348623157E+308-2.2250738585072014E-308 02.2250738585072014E-3081.7976931348623157E+308 

存储要求:8个字节

DECIMAL(M[,D]) [ZEROFILL]NUMERIC(M[, D]) [ZEROFILL]

取值范围:实际的范围可以通过MD的选择被限制

存储要求:M字节(低于3.23版本)M+2字节(3.23或更高版本)

NUMERICDECIMAL类型

1-6  MDDECIMAL类型取值范围的影响

    

取值范围(MySQL < 3.23

取值范围(MySQL * 3.23

DECIMAL(4, 1)

-9.9    99.9

-999.9  9999.9

DECIMAL(5, 1)

-99.9  999.9

-9999.9  99999.9

DECIMAL(6, 1)

-999.9 9999.9

-99999.9 999999.9

DECIMAL(6, 2)

-99.99 999.99

 -9999.99 99999.99

DECIMAL(6, 3)

-9.999 99.999

-999.999 9999.999

 

给定的 DECIMAL 类型的取值范围取决于MySQL 的版本。

对于 MySQL 3.23 以前的版本,DECIMAL(M, D) 列的每个值占用 M 字节,而符号(如果需要)和小数点包括在 M 字节中。因此,类型为 DECIMAL(5,2) 的列,其取值范围为 -9.99 99.99,因为它们覆盖了所有可能的 5 个字符的值。

对于MySQL 3.23DECIMAL 值是根据 ANSI 规范进行处理的,ANSI 规范规定 DECIMAL(M, D) 必须能够表示 M 位数字及 D 位小数的任何值。例如,DECIMAL(5, 2) 必须能够表示从 -999.99 999.99 的所有值。而且必须存储符号和小数点,因此自 MySQL 3.23 以来 DECIMAL 值占 M + 2 个字节。对于 DECIMAL(5, 2),“最长”的值(-999.99)需要 7 个字节。在正取值范围的一端,不需要正号,因此 MySQL 利用它扩充了取值范围,使其超过了 ANSI 所规范所要求的取值范围。如 DECIMAL(5, 2) 的最大值为 9999.99,因为有 7 个字节可用。

简而言之,在MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于更早版本中的 DECIMAL(M + 2, D) 的取值范围。

 

1.4.4 日期和时间类型

MySQL提供几种时间和日期类型,包括日期和时间类型是DATETIMEDATETIMESTAMPTIMEYEAR。对这几种时间和日期类型概述如下:

DATA

取值范围:“1000-01-01”到“9999-12-31

存储需求:3字节

TIME

取值范围:“-838:59:59”到“838:59:59

存储需求:3字节

DATATIME

取值范围:“1000-01-01 00:00:00”到“9999-12-31 23:59:59

存储需求:8字节

TIMESTAMP[(M)]

取值范围:“19700101000000”到2037年的某个时刻

存储需求:4字节

YEAR[(M)]

取值范围:19012155

存储需求:1字节

1.4.4.1 Y2K问题和日期类型 

MySQL本身Y2K安全的,但是呈交给MySQL的输入值可能不是。一个包含2位年份值的任何输入是由二义性的,因为世纪是未知的。这样的值必须被解释成4位形式,因为MySQL内部使用4位存储年份。 

对于DATETIME, DATE, TIMESTAMPYEAR类型,MySQL使用下列规则的解释二义性的年份值: 

l  在范围00-69的年值被变换到2000-2069 

l  在范围70-99的年值被变换到1970-1999 

记得这些规则仅仅提供对于你数据的含义的合理猜测。如果MySQL使用的启发规则不产生正确的值,你应该提供无二义的包含4位年值的输入。

1.4.4.2 DATETIME,DATETIMESTAMP类型 

DATETIME, DATETIMESTAMP类型是相关的。本节描述他们的特征,他们是如何类似的而又不同的。 

DATETIME类型用在你需要同时包含日期和时间信息的值时。MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是'1000-01-01 00:00:00''9999-12-31 23:59:59'。(“支持”意味着尽管更早的值可能工作,但不能保证他们可以。)

DATE类型用在你仅需要日期值时,没有时间部分。MySQL检索并且以'YYYY-MM-DD'格式显示DATE值,支持的范围是'1000-01-01''9999-12-31' 

TIMESTAMP列类型提供一种类型,你可以使用它自动地用当前的日期和时间标记INSERTUPDATE的操作。如果你有多个TIMESTAMP列,只有第一个自动更新。TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。

自动更新第一个TIMESTAMP列在下列任何条件下发生: 

l  列没有明确地在一个INSERTLOAD DATA INFILE语句中指定。 

l  列没有明确地在一个UPDATE语句中指定且一些另外的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。) 

l  你明确地设定TIMESTAMP列为NULL.

例如,我们创建一个表:

CREATE TABLE my_test

(

       id INT,

       ts TIMESTAMP

)

然后,用如下语句录入数据:

INSERT my_test VALUES(1,20010101000000)

INSERT my_test(id) VALUES(2)

然后,查询表中的内容:

SELECT * from my_test

你可以看到内容:

+------+----------------+
| id   | ts             |
+------+----------------+
|    1 | 20010101000000 |
|    2 | 20010113165713 |
+------+----------------+

1.4.4.3 TIME类型

MySQL检索并以'HH:MM:SS'格式显示TIME(或对大小时值,'HHH:MM:SS'格式)TIME值的范围可以从'-838:59:59''838:59:59'。小时部分可能很大的的原因是TIME类型不仅可以被使用在表示一天的时间(它必须是不到24个小时),而且用在表示在2个事件之间经过的时间或时间间隔(它可以是比24个小时大些,或甚至是负值) 

你能用多中格式指定TIME值: 

l  作为'HH:MM:SS'格式的一个字符串。“宽松”的语法被允许--任何标点符号可用作时间部分的分隔符,例如,'10:11:12''10.11.12'是等价的。 

l  作为没有分隔符的'HHMMSS'格式的一个字符串,如果它作为一个时间解释。例如,'101112'被理解为'10:11:12',但是'109712'是不合法的(它有无意义的分钟部分)并变成'00:00:00' 

l  作为HHMMSS格式的一个数字,如果它能解释为一个时间。例如,101112被理解为'10:11:12' 

1.4.4.4 YEAR类型 

YEAR类型是一个有效的利用1字节类型表示年份。MySQL检索并且以YYYY格式显示YEAR值,其范围是19012155 如果,只想保存日期,那么YEAR比其它类型比如SAMLLINT更为有效。

你能用多种格式指定YEAR值,既可以用4为字符,也可以使用4为字符串,当然要在19012155范围之内。

作为YEAR的一个优点是,你可以指定一个在'00''99'范围的2位字符串或者一个在'00''69''70''99'范围的值被变换到在20002069范围和19701999YEAR值。 

1.4.5 字符串类型

MySQL提供的字符串类型包括CHARVARCHARBLOBTEXTENUMSET。对这些类型作一个简要的叙述如下:

CHAR(M) [BINARY]

一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。在MySQL3.23以前的版本,M的范围是1 255个字符,在MySQL3.23版中,M值的范围是0 255个字符.当值被检索时,空格尾部被删除。CHAR类型在排序和比较时不区分大小写,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHARCHARACTER的一个缩写。 CHAR(0) 可以用于在希望定义一个列,但由于尚不知道其长度,所以不想给其分配空间的情况下,CHAR(0) 列作为占位符很有用处。以后可以用 ALTER TABLE 来加宽这个列。

存储需求:M字节

[NATIONAL] VARCHAR(M) [BINARY]

一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)M的范围是1 255个字符。 VARCHAR类型在排序和比较时不区分大小写,除非给出BINARY关键词。VARCHARCHARACTER VARYING一个缩写。 

存储需求:L+1字节(L是存储实际值需要的长度,1为存储该值实际长度)

TINYBLOBTINYTEXT

一个BLOBTEXT列,最大长度为255(2^8-1)个字符。

存储需求:L+1字节

BLOBTEXT

一个BLOBTEXT列,最大长度为65535(2^16-1)个字符。

存储需求:L+2字节

MEDIUMBLOBMEDIUMTEXT

一个BLOBTEXT列,最大长度为16777215(2^24-1)个字符。

存储需求:L+3字节

LONGBLOBLONGTEXT

一个BLOBTEXT列,最大长度为4294967295(2^32-1)个字符。

存储需求:L+4字节

ENUM('value1','value2',...)

枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1''value2', ...,NULL。一个ENUM最多能有65535不同的值。 

存储需求:12字节

SET('value1','value2',...)

一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。

存储需求:12348字节

 

在某种意义上,串实际是一种非常“通用”类型,因为可用它们来表示任意值,不仅仅是字符串。例如,可用串类型来存储二进制数据,如图像、视频或音频。

对于所有串类型,都要剪裁过长的值使其适合于相应的串类型。但是串类型的取值范围很不同,有的取值范围很小,有的则很大。取值大的串类型能够存储近 4GB 的数据。因此,应该使串足够长以免您的信息被切断(由于受客户机/服务器通信协议的最大块尺寸限制,列值的最大限额为 24MB)。

另外,对于串类型,在比较时是忽略大小写的,使用BINARY关键字,则比较时采用ASCII码的方式,即不再忽略大小写。可以使用BINARY的串类型为CHARVARCHAR

1.4.5.1 CHARVARCHAR类型 

 

CHARVARCHAR类型是类似的,但是在他们被存储和检索的方式不同。 其具体的异同为:

l  当给定一个CHAR列的值时,其长度将被被修正为在你创建表时所声明的长度。长度可以是1255之间的任何值。(在MySQL 3.23中,CHAR长度可以是0255) CHAR值被存储时,他们被用空格在右边填补到指定的长度。当CHAR值被检索时,拖后的空格被删去。 

l  VARCHAR列中的值是变长字符串。你可以声明一个VARCHAR列是在1255之间的任何长度,就像对CHAR列。然而,与CHAR类型相反,VARCHAR值只存储所需的字符,外加一个字节记录长度,值不被填补;相反,当值被存储时,拖后的空格被删去。(这个空格删除不同于ANSI SQL规范。)

l  如果你把一个超过列最大长度的值赋给一个CHARVARCHAR列,值被截断以适合串类型。

例如,我们用下表来说明存储一系列不同的串值到CHAR(4)VARCHAR(4)列的结果:

1-7  CHAR类型和VARCHAR类型的对比

CHAR(4)

存储需求

VARCHAR(4)

存储需求

''

'    '

4字节

''

1字节

'ab'

'ab  '

4字节

'ab'

3字节

'abcd'

'abcd'

4字节

'abcd'

    5字节

'abcdefgh'

'abcd'

4字节

'abcd'

    5字节

 

虽然实际存储的值并不一样,但是查询时,这两种类型是一致的,因为CHAR(4)类型多于的空格将被忽略。

需要注意的是,除了少数情况外,在同一个表中不能混用 CHAR VARCHAR这两种类型,你只能使用其中之一。如果你创建表时,包括这两种类型,在一般情况下,MySQL 会将列从一种类型转换为另一种类型。这样做的原因如下:

l  行定长的表比行可变长的表容易处理,效率更高。

l  只有所有的类型是定长时,行才是定长的,才能提高性能。

l  有时为了节省存储空间,使用了变长类型,在这种情况下最好也将定长列转换为可变长列。

这表示,如果表中有 VARCHAR 列,那么表中不可能同时有 CHAR 列;MySQL 会自动地将它们转换为 VARCHAR 列。

转换的规则:

l  长度小于4VARCHAR被改变为CHAR 

l  如果在一个表中的任何列有可变长度,结果是整个行是变长的。因此, 如果一张表包含任何变长的列(VARCHARTEXTBLOB),所有大于3个字符的CHAR列被改变为VARCHAR列。

例如,我们创建下面一个表:

CREATE TABLE ch_type

(

       ch1 char(3),

       ch2 varchar(3),

       ch3 char(4),

       ch4 varchar(4)

)

然后查看表的结构:

DESCRIBE ch_type

MySQL3.23上结果为:

+-------+------------+
| Field | Type       |
+-------+------------+
| ch1   | char(3)    |
| ch2   | char(3)    |
| ch3   | varchar(4) |
| ch4   | varchar(4) |
+-------+------------+

1.4.5.2 BLOBTEXT类型 

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4BLOB类型TINYBLOBBLOBMEDIUMBLOBLONGBLOB仅仅在他们能保存值的最大长度方面有所不同。 

4TEXT类型TINYTEXTTEXTMEDIUMTEXTLONGTEXT对应于4BLOB类型,并且有同样的最大长度和存储需求。在BLOBTEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB

如果你把一个超过列类型最大长度的值赋给一个BLOBTEXT列,值被截断以适合它。 

在大多数方面,你可以认为一个TEXT行列是你所希望大的一个VARCHAR列。同样,你可以认为一个BLOB列是一个VARCHAR BINARY列。差别是: 

l  MySQL版本3.23.2和更新,你能在BLOBTEXT列上索引。更旧的MySQL版本不支持这个。 

l  当值被存储时,对BLOBTEXT列没有拖后空格的删除,因为对VARCHAR列有删除。 

l  BLOBTEXT列不能有DEFAULT值。 

由于,BLOBTEXT类型可以存储非常多的数据,因此使用BLOBTEXT类型需要注意的是:

l  BLOB TEXT 列在 MySQL 3.23 以上版本中可以进行索引,虽然在索引时必须指定一个用于索引的约束尺寸,以免建立出很大的索引项从而抵消索引所带来的好处。

l  由于 BLOB TEXT 值的大小变化很大,如果进行的删除和更新很多,则存储它们的表出现高碎片率会很高。应该定期地运行 OPTIMIZE TABLE 减少碎片率以保持良好的性能。

 

1.4.5.3 ENUMSET类型 

1ENUMSET类型的定义

ENUMSET类型是两种特殊的字符串类型,它们有很多相似之处,使用方法也是分类系,通常都从一个在表创建时明确列举的允许值的一张表中选择,其主要的区别是ENUM列必须是值集合中的一个成员,而SET列可以包括其中的任意成员。

例如,创建如下两个串列:

color ENUM(“red”,”black”,”green”,”yellow”)

property SET(“car”,”house”,”stock”) NOT NULL

那么colorproperty可能的值分别为:

colorNULL”red””black””green””yellow”

property可能的值就复杂的多:

“”

“car”

“house”

“car,house”

“stock”

“car,stock”

“house,stock”

“car,house,stock”

由于空串可以表示不具备值的集合的任何一个值,所以这也是一个合法的SET值。

ENUM类型可以有65536个成员,而SET类型最多可以有64个成员。

2ENUMSET类型是如何存储的

ENUMSET类型在数据库内部并不是用字符的方式存储的,而是使用一系列的数字,因此更为高效。

ENUMSET类型的合法值列表的原则为:

l  此列表决定了列的可能合法值。

l  可按任意的大小写字符插入 ENUM SET 值,但是列定义中指定的串的大小写字符决定了以后检索它们时的大小写。

l  ENUM 定义中的值顺序就是排序顺序。SET 定义中的值顺序也决定了排序顺序,但是这个关系更为复杂,因为列值可能包括多个集合成员。

l  SET 定义中的值顺序决定了在显示由多个集合成员组成的 SET 列值时,子串出现的顺序。

对于ENUM列类型,成员是从 1 开始顺序编号的。(0 MySQL 用作错误成员,如果以串的形式表示就是空串。)枚举值的数目决定了 ENUM 列的存储大小。一个字节可表示 256 个值,两个字节可表示 65 536 个值。因此,枚举成员的最大数目为 65 536(包括错误成员),并且存储大小依赖于成员数目是否多于 256 个。在 ENUM 定义中,可以最多指定 65 535(而不是 65 536)个成员,因为 MySQL 保留了一个错误成员,它是每个枚举的隐含成员。在将一个非法值赋给 ENUM 列时,MySQL 自动将其换成错误成员。

对于SET类型,SET 列的集合成员不是顺序编号的,而是每个成员对应 SET 值中的一个二进制位。第一个集合成员对应于 0 位,第二个成员对应于 1 位,如此等等。数值 SET 0 对应于空串。SET 成员以位值保存。每个字节的 8 个集合值可按此方式存放,因此 SET 列的存储大小是由集合成员的数目决定的,最多 64 个成员。对于大小为 1 89 1617 2425 3233 64 个成员的集合,其 SET 值分别占用 1234 8 个字节。

例如,还是上面的例子,我们从一个表中检索出ENUMSET列的值,及其对应的数值:

对于ENUM类型的color

SELECT color,color+0 from my_table

其结果为:

+--------+---------+
| color  | color+0 |
+--------+---------+
| NULL   |    NULL |
| black  |       2 |
| green  |       3 |
| yellow |       4 |
| red    |       1 |
| red    |       1 |
| green  |       3 |
| green  |       3 |
| yellow |       4 |
+--------+---------+

对于SET类型的property列,同样的

SELECT property,property+0 FROM my_table;

其结果为

+-----------------+------------+
| property        | property+0 |
+-----------------+------------+
|                 |          0 |
| house,stock     |          6 |
| car,stock       |          5 |
| stock           |          4 |
| car,house,stock |          7 |
| car,house       |          3 |
| house           |          2 |
| car,stock       |          5 |
| house,stock     |          6 |
+-----------------+------------+

你可以仔细了解它们之间的对应关系。

因此,在给列赋值、检索时,你不仅可以使用值表中的字符串,也可以使用数值来表示一个值,例如下列语句是等价的:

INSERT my_table SET property=’car,house,stock’

INSERT my_table SET property=7

对于ENUM列也同样如此:

INSERT my_table SET color=’red’;

INSERT my_table SET color=1

1.4.6总结

本节对MySQL的数据类型和列类型进行了简单的描述。这一部分是我们继续学习SQL语言的基础,但是如果你作为一个初学者可能无法立刻理解本节的内容,没有关系,你完全可以略过,继续下去,相信在读完本书的后几章之后,在返回来,就会容易理解了。

本节中出现大量的SQL语句,尤其是建表的语句。你可能现在还不知道如何完成这些查询,没有关系,你只需要理解其中的含义就可以了。阅读了以后的几章,你就会理解这一切。

 


这篇文章对你多有用?

用户评语

添加评语
当前还没有评语.


.: .: .: .: .:
[ 登陆 ]
北京护航科技有限公司 2006

Novots Technologies Limited