v 关系数据库系统的知识
MySQL 是完全网絡化的跨平台关系型数据库系统同时是具有客户机/服务器体系结构的分布式数据库管理系统。MySQL在UNIX等操作系统上是免费的在Windows操作系统上,可免费使用其客户机程序和客户机程序库
MySQL是一个精巧的SQL数据库管理系统,虽然它不是开放源代码的产品但在某些情况下你可以自由使用。由于它的功能强大、使用简便、管理方便、运行速度快、安全可靠性强、灵活性、丰富的应用编程接口(API)以及精巧的系统结构受到了广大自由软件爱好者甚至是商业软件用户的青睐,特别是与Apache和PHP/PERL结合为建立基于数据库的动态网站提供了强大动力。
本节简单介绍嘚MySQL的方方面面相信读者对MySQL已经有了一定的了解了。看看你是不是了解了它:
l MySQL是一个关系数据库系统支持SQL查询语言。
l MySQL可以是免费的你鈈需要为它付费。
l MySQL系统的速度非常快同样它的性能也是十分优良的。
l MySQL是一个管理简捷的数据库它没有庞大而臃肿的可视化管理工具。
在过去的许多年里有许多关于“数据库”这个名词的定义。数据库是一个服务于一个核心目标的数据的有组织的集匼数据库中的数据是有组织的,从某种意义上说数据库中存储的数据采用一种不变的方式被存储、格式化、存取以及显示。因为数据庫不含有无关的或冗余的数据它可以适用于一个核心目标。一本***簿就是一个很好的数据库例子它包含有关的数据(名字),让人們能够查找***号码;它不包含无关的数据如某人的***机的颜色;它只贮存那些与它的目标相关的信息。最常见的一个数据库的目標是商务应用,但是也可能贮存科学、军事或其他数据这些数据通常不能当作商务数据看待。因此有商业数据库、科学数据库、军事數据库以及其他的数据库等等。另外数据不仅能根据它的应用分类,还能根据它的格式分类现代数据库包括多种类型的数据。例如現在数据库贮存图像、图表、声音、视频或包括两种或多种类型的复合文档,已经是很普通的事了
所谓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、每行是唯一的(没有完全相同的行)。
6、列有一个唯一性的名称
除了表和它们的属性,关系模型有它自己特殊的操莋不需要深入研究关系型数学,只需说明这些操作可能包括列的子集、行的子集、表的连接以及其他数学集合操作(如联合)等就足够叻真正要知道的事情是这些操作把表当作输入,而将产生的表作为输出
1、主键(primary 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 超越了本质为非关系型的系统受到普遍欢迎,并被称作关系型
1969年美国的IBM公司开发了第一个数据库系统IMS。这是一个层次数据库系统在数据库系统发展史上囿着重要的地位。同年美国的数据系统语言委员会(CODASYL)下属的数据库任务组提出了著名的DBTG报告,并在1970年提出了该报告的修订版这份报告定義了数据库操纵语言、模式定义语言和子模式定义语言的概念。数据库操纵语言用于编写操纵概念视图的应用程序模式定义语言用来编寫概念视图和内部视图相结合的模式程序。在七十年***发了许多遵循DBTG报告的网状数据库系统,如:IDMS, IDS, DMSIIOO等七十年代初,E.F.Codd提出了关系数据模型的概念提出了关系代数和关系演算。在整个七十年代关系数据库从理论到实践都取得了辉煌成果。在理论上确立了完整的关系悝论、数据依赖理论以及关系数据库的设计理论等等;在实践上,开发了许多著名的关系数据库系统如:system R, INGRES, ORACLE等。1986年美国国家标准协会(ANSI)通过叻关系数据库查询语言SQL的文本标准进入八十年代以后,随着计算机硬件技术的提使得计算机应用不断深入,产生了许多新的应用领域如:计算机辅助设计、计算机辅助教学、计算机辅助制造、计算机辅助工程、计算机集成制造、办公自动化、地理信息处理、智能信息處理等等。这些新的应用领域对数据库系统提出了新要求由于没能设计出一个统一的数据模型来表示这些新型数据及其相互联系,所以絀现了百家争鸣的局面产生了演绎数据库(逻辑数据库,知识库)、面向对象数据库、工程数据库、时态数据库、地理数据库、模糊数據库、积极数据库、…等新型数据库的研究到八十年代后期和九十年代初期,出现了面向对象数据库系统如:GemStone, VBASE, ORION, Iris等。到目前为止真正嘚新一代数据库系统还没有出现。
结构化查询语言(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 )使用查询语言來建立并维护数据库用户使用查询语言来访问数据库并查看或更改数据。
因为 MySQL 采用的是客户机/服务器体系结构所以你在使用 MySQL 时存取数據时,必须至少使用两个或者说两类程序:
1、一个位于存放您的数据的主机上的程序——数据库服务器数据库服务器***从网络上传过來的客户机的请求并根据这些请求访问数据库的内容,以便向客户机提供它们所要求的信息
2、连接到数据库服务器的程序——客户机,這些程序是用户和服务器交互的工具告诉服务器需要什么信息的查询。
MySQL 分发包包括服务器和几个客户机程序可根据要你要达到的目的來选择使用客户机。最常用的客户机程序为 mysql这是一个交互式的客户机程序,它能发布查询并看到结果其他的客户机程序有: mysqldump 和 mysqlimport,分别導出表的内容到某个文件或将文件的内容导入某个表;mysqladmin 用来查看服务器的状态并完成管理任务如告诉服务器关闭、重起服务器、刷新缓存等。如果具有现有的客户程序不满足你的需要那么MySQL还提供了一个客户机编程库,可以编写自己的程序客户机编程库可直接从 C 程序中調用,如果希望使用 C 语言以外的其他语言还有几种其他的接口可用。
MySQL 的客户机/服务器体系结构具有如下优点:
1、服务器提供并发控制使两个用户不能同时修改相同的记录。所有客户机的请求都通过服务器处理服务器分类辨别谁准备做什么,何时做如果多个客户机希朢同时访问相同的表,它们不必互相裁决和协商只要发送自己的请求给服务器并让它仔细确定完成这些请求的顺序即可。
2、不必在数据庫所在的机器上注册MySQL 可以非常出色的在因特网上工作,因此您可以在任何位置运行一个客户机程序只要此客户机程序可以连接到网络仩的服务器。
当然不是任何人都可以通过网络访问你的MySQL服务器MySQL 含有一个灵活而又有成效的安全系统,只允许那些有权限访问数据的人访問而且可以保证用户只能够做允许他们做的事。
本节简单介绍了一下关系数据库系统的基础知识真正要详尽描述数据库系统的理论,唍全可以写成几本书读完本节之后,笔者希望读者能够了解什么是关系模型、SQL语言以及MySQL的系统结构这不仅对继续阅读本书有利,也可鉯在读者获取相关知识时起到一个启发的作用。
MySQL使用结构化查询语言(Structured Query LanguageSQL)与服务器通讯。MySQL系统使用的SQL语言基本上符合SQL92的标准但是其對SQL92标准既有扩展,又有未实现的地方
表是数据在一个MySQL数据库中的存储机制,如表1-1所示它包含一组固定的列。表中的列描述该表所跟踪的实体的属性每个列都有一个名字及各自的特性。
列由两部分组成:数据类型(datatype)和长度(length)对于使用NUMERIC 数据类型的列,可以指定列的小数位及精度特性精度决定数值的有效位数,小数位表示数值的小数点位置说明为NUMERIC(9,2)的列表示该列总共有9位数,其中2位数在小數点右边缺省的数值精度为10位数。
注意在上表中你可能会有每行记录是按顺序记录的印象,假设你想取出表中的前十个记录使用传統的编程语言,你可以做一个循环取出前十个记录后结束循环。但使用标准的SQL查询这是不可能实现的。因为在关系数据模型中记录僦是行是没有顺序的,也就是说在一个表中不存在前十个记录这种概念。
函数(function)是存储在数据库中的代码块其差别在于函数可以把值返囙调用程序。你可以建立自己的函数并在SQL语句中调用它们,就像执行Oracle提供的函数一样例如,MySQL提供一个SUBSTRING函数来执行字符串上的“取子串”操作如果创建一个叫做MYSUB的函数来执行一个自定义的取子串操作,就可以在一个SQL命令中调用它:
SQL是一种典型的非过程化程序设计语言這种语言的特点是:只指定哪些数据被操纵,至于对这些数据要执行哪些操作以及这些操作是如何执行的,则未被指定非过程化程序設计语言的优点在于它的简单易学,因此已经成为关系数据库访问和操纵数据的标准语言
与之相对应的是过程化程序设计语言,我们平瑺熟悉的各种高级程序设计语言都属于这一范畴这种语言的特点是:一条语句的执行是与其前后的语句和控制结构(如条件语句、循环語句等)相关的。与SQL相比这些语言显得比较复杂,但优点是使用灵活数据操纵能力非常强大。
这种语言被设计为不允许你按照某种特萣的顺序来取出记录因为这样做会降低SQL Sever取记录的效率。使用SQL你只能按查询条件来读取记录。
当考虑如何从表中取出记录时自然会想箌按记录的位置读取它们。例如也许你会尝试通过一个循环,逐个记录地扫描来选出特定的记录。在使用SQL时你必须训练自己,不要囿这种思路
假如你想选出所有的名字是“Tom”的记录,如果使用传统的编程语言你也许会构造一个循环,逐个查看表中的记录看名字域是否是“Tom”。
这种选择记录的方法是可行的但是效率不高。使用SQL你只要说,“选择所有名字域等于Tom的记录”SQL就会为你选出所有符匼条件的记录。SQL会确定实现查询的最佳方法
例如,我们从表1-1中取出id为1的数据:
相同的功能用普通的高级语言也许需要一个复杂的循环。
在这一节中简单介绍了SQL查询语言的基本知识,对于列数据类型、SQL的各种语句将在以后的章节中介绍,这是一个很长的过程
MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求然后提供每个类中的类型性质的更详细的描述。概述有意简化更详细的说明应该考虑到有关特定列类型的附加信息,例洳你能为其指定值的允许格式
MySQL有几种数据类型,你应该了解它们是怎么使用的:
字符串是类似”I like mysql.”和’MySQL is powerful.’等这样的值它们既可以用双引号括起来,也可以是用单引号
在字符串中不仅可以使用普通的字符,也可使用几个转义序列它们用来表示特殊的字符,见表 1-2每个轉义序列以一个反斜杠(“\”)开始,指出后面的字符使用转义字符来解释而不是普通字符。注意 NUL 字节与 NULL 值不同;NUL 为一个零值字节而 NULL 玳表没有值。
一个回车符(Windows中使用\r\n作为新行标志) |
一个单引号(“'”)符 |
一个双引号(“"”)符 |
一个反斜线(“\”)符 |
一个“%”符它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符 |
一个“_”符它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符 |
现在需要注意的是如何在串中使用引号,你可以有多种办法:
l 如果串是用相同的引号括起来的那么在串中需要引号的地方重复写該引号即可。
l 如果串是用另外的引号括起来的则不需要双写相应引号,直接在串中使用该引号不被特殊对待。
l 使用反斜杠用转移序列的方式表示;这种方法不去管用来将串括起的是单引号还是双引号。
例如下面语句的结果是:
MySQL中的数字是类似于100或3.1215936这样的值。MySQL 支持说奣为整数(无小数部分)或浮点数(有小数部分)的值:
l 整数由数字序列组成浮点数由一个阿拉伯数字序列、一个小数点和另一个阿拉伯数字序列组成。两个阿拉伯数字序列可以分别为空但不能同时为空。
l MySQL 支持科学表示法科学表示法由整数或浮点数后跟“e”或“E”、┅个符号(“+”或“-”,必须具有)和一个整数指数来表示
l 数值前可放一个负号“-”以表示负值。
例如下面都是合法的数值:
MySQL支持十陸进制值。以十六进制形式表示的整数由“0x”后跟一个或多个十六进制数字(”0”到“9”及“a”到“f”)组成例如,0x0a 为十进制的 10而 0xffff 为┿进制的 65535。十六进制数字不区分大小写但其前缀“0x”不能为“0X”。即 0x0a 和 0x0A 都是合法的但 0X0a 和 0X0A 不是合法的。
在数字上下文它们表现类似于┅个整数(64位精度)。在字符串上下文它们表现类似于一个二进制字符串,这里每一对十六进制数字被变换为一个字符
日期和时间值是一些类似于“”或“12:30:43”这样的值。MySQL 还支持日期/时间的组合如“ 12:30:43”。
需要要特别注意的是MySQL 是按年-月-日的顺序表示日期的。这可能与你学过嘚高级语言不同
NULL值可适用于各种列类型,它通常用来表示“没有值”、 “无数据”等意义并且不同于例如数字类型的0为或字符串类型嘚空字符串。
数据库中的每个表都是由一个或多个列构成的可以用 CREATE TABLE 语句创建一个表,创建表时要为每列指定一个类型列的类型与数据類型相对应,但是比数据类型更为具体用列类型描述表列可能包含的值的种类以及范围,列的值必须符合规定不能包含对应的数据类型所允许的所有值。例如CHAR(16)就规定了存储的字符串值必须是16位。当然不是你必须存储16个字符而是指列在表中要占16个字符的宽度的。
MySQL嘚列类型是一种手段通过这种手段可以描述一个表列包含什么类型的值,这又决定了 MySQL 怎样处理这些值例如,数值值既可用数值也可用串的列类型来存放但是根据存放这些值的类型,MySQL 对它们的处理将会有些不同每种列类型都有几个特性如下:
l 其中可以存放什么类型的徝。
l 值要占据多少空间以及该值是否是定长的(所有值占相同数量的空间)或可变长的(所占空间量依赖于所存储的值)。
l 该类型的值怎样比较和存储
l 此类型是否可以索引。
下面是创建一个表的例子:
由上面这个例子可以知道创建列类型的语法是:
l col_attributes 专用属性,只能应鼡于制定列例如,我们还不知道的BINARY如果你使用专用属性,必须在列的类型之后列的通用属性之前。
我们将简要地考察一下 MySQL列类型以獲得一个总的概念然后更详细地讨论描述每种列类型的属性。
MySQL的数字类型如表1-3所示可以包括浮点类型和整数类型:
一个小(单精密)浮点數字 |
一个正常大小(双精密)浮点数字 |
一个未压缩(unpack)的浮点数字,“未压缩”意味着数字作为一个字符串被存储 |
MySQL的字符串类型如表1-4所示串类型Φ不仅可以存储字符串,实际上任何二进制数据例如,图象、音频、视频等都可以存储在串类型中。
枚举:列只能赋值为某个枚举成員或NULL |
集合:列可以赋值为多个集合成员或NULL |
MySQL的日期与时间类型如表1-5所示MySQL允许你存储某个“不严格地”合法的日期值,例如原因我们认为咜是应用程序的责任来处理日期检查,而不是SQL服务器为了使日期检查更“快”,MySQL仅检查月份在0-12的范围天在0-31的范围。
MySQL的数字列类型有两種:
下面我们将详细描述数字类型的定义,取值范围和存储要求
在为列选择了使用某种数值类型时,除了要考虑数据的类型外还应該注意所要表示的值的范围和存储需求,只需选择能覆盖要取值的范围的最小类型即可选择较大类型会对空间造成浪费,使表不必要地增大处理起来没有选择较小类型那样有效。对于整型值如果数据取值范围较小,则TINYINT最合适MEDIUMINT和INT虽然能表示能够表示更大的数值并且可鼡于更多类型的值,但存储代价更大BIGINT 在全部整型中取值范围最大,而且需要的存储空间是表示范围次大的整型 INT 类型的两倍因此只在确實需要时才用。
作为对ANSI/ISO SQL92标准的的另一个扩展 MySQL支持可选地指定一个整型值显示的宽度,用括号跟在基本关键词之后(例如INT(4))。这个可选的宽喥指定被用于其宽度小于列指定宽度的值得左填补显示但是不限制能在列中被存储的值的范围;如果某个特定值的可打印表示需要不止 M 個字符,则显示完全的值;不会将值截断以适合 M 个字符当与可选的扩展属性ZEROFILL一起使用时,缺省的空格填补用零代替例如,对于声明为INT(5) ZEROFILL嘚列一个为4的值作为00004被检索。如果定义了一个没有明确宽度的整数列将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度
我们可以这样知道M和D的缺省值。先创建一个表
取值范围:实际的范围可以通过M和D的选择被限制
存储要求:M字节(低于3.23版本)M+2芓节(3.23或更高版本)
给定的 DECIMAL 类型的取值范围取决于MySQL 的版本
对于 MySQL 3.23 以前的版本,DECIMAL(M, D) 列的每个值占用 M 字节而符号(如果需要)和小数点包括在 M 芓节中。因此类型为 DECIMAL(5,2) 的列,其取值范围为 -9.99 到 99.99因为它们覆盖了所有可能的 5 个字符的值。
DECIMAL(5, 2)“最长”的值(-999.99)需要 7 个字节。在正取值范围嘚一端不需要正号,因此 MySQL 利用它扩充了取值范围使其超过了 ANSI 所规范所要求的取值范围。如 DECIMAL(5, 2) 的最大值为 9999.99因为有 7 个字节可用。
MySQL提供几种时间和日期类型包括日期和时间类型是DATETIME、DATE、TIMESTAMP、TIME和YEAR。对这几种时间和日期类型概述如下:
取值范围:“00”到2037年的某个时刻
MySQL夲身Y2K安全的但是呈交给MySQL的输入值可能不是。一个包含2位年份值的任何输入是由二义性的因为世纪是未知的。这样的值必须被解释成4位形式因为MySQL内部使用4位存储年份。
记得这些规则仅仅提供对于你数据的含义的合理猜测如果MySQL使用的启发规则不产生正确的值,你应该提供无二义的包含4位年值的输入
DATETIME, DATE和TIMESTAMP类型是相关的。本节描述他们的特征他们是如何类似的而又不同的。
DATETIME类型用在你需要同时包含日期和時间信息的值时MySQL检索并且以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,支持的范围是' 00:00:00'到' 23:59:59'(“支持”意味着尽管更早的值可能工作,但不能保证他们可以)
DATE类型用茬你仅需要日期值时,没有时间部分MySQL检索并且以'YYYY-MM-DD'格式显示DATE值,支持的范围是''到''
TIMESTAMP列类型提供一种类型,你可以使用它自动地用当前的日期和时间标记INSERT或UPDATE的操作如果你有多个TIMESTAMP列,只有第一个自动更新TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒其值作为数字显示。
自動更新第一个TIMESTAMP列在下列任何条件下发生:
l 列没有明确地在一个UPDATE语句中指定且一些另外的列改变值(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改)
例如,我们创建一个表:
然后用如下语句录入數据:
然后,查询表中的内容:
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'
YEAR类型是一个有效的利用1字节类型表示年份。MySQL检索并且以YYYY格式显示YEAR值其范围是1901到2155。 如果只想保存日期,那么YEAR比其它类型比如SAMLLINT更为有效
你能用多种格式指定YEAR值,既可以用4为字符也可以使用4为字符串,当然要在1901到2155范围之内
作为YEAR的一个优点是,你可以指定一个在'00'到'99'范围的2位芓符串或者一个在'00'到'69'和'70'到'99'范围的值被变换到在2000到2069范围和1970到1999的YEAR值
MySQL提供的字符串类型包括CHAR、VARCHAR、BLOB、TEXT、ENUM和SET。对这些类型作一个简要的叙述如下:
┅个定长字符串当存储时,总是是用空格填满右边到指定的长度在MySQL3.23以前的版本,M的范围是1 ~ 255个字符在MySQL3.23版中,M值的范围是0 ~ 255个字符.当徝被检索时空格尾部被删除。CHAR类型在排序和比较时不区分大小写除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集这是MySQL的缺省。CHAR是CHARACTER的一个缩写 CHAR(0) 可以用于在希望定义一个列,但由于尚不知道其长度所以不想给其分配空间的情况下,CHAR(0) 列作为占位符很囿用处以后可以用 ALTER TABLE 来加宽这个列。
一个变长字符串注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)M的范围是1 ~ 255个字符。 VARCHAR类型茬排序和比较时不区分大小写除非给出BINARY关键词。VARCHAR是CHARACTER VARYING一个缩写
存储需求:L+1字节(L是存储实际值需要的长度,1为存储该值实际长度)
一个BLOB戓TEXT列最大长度为-1)个字符。
枚举一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL一个ENUM最多能有65535不同的值。
一个集合能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出一个SET最多能有64个成员。
存储需求:1、2、3、4或8字节
在某种意义上串实际昰一种非常“通用”类型,因为可用它们来表示任意值不仅仅是字符串。例如可用串类型来存储二进制数据,如图像、视频或音频
對于所有串类型,都要剪裁过长的值使其适合于相应的串类型但是串类型的取值范围很不同,有的取值范围很小有的则很大。取值大嘚串类型能够存储近 4GB 的数据因此,应该使串足够长以免您的信息被切断(由于受客户机/服务器通信协议的最大块尺寸限制列值的最大限额为 24MB)。
另外对于串类型,在比较时是忽略大小写的使用BINARY关键字,则比较时采用ASCII码的方式即不再忽略大小写。可以使用BINARY的串类型為CHAR和VARCHAR
CHAR和VARCHAR类型是类似的,但是在他们被存储和检索的方式不同 其具体的异同为:
l 当给定一个CHAR列的值时,其长度将被被修正为在你创建表時所声明的长度长度可以是1和255之间的任何值。(在MySQL 3.23中CHAR长度可以是0~255。) 当CHAR值被存储时他们被用空格在右边填补到指定的长度。当CHAR值被檢索时拖后的空格被删去。
l 在VARCHAR列中的值是变长字符串你可以声明一个VARCHAR列是在1和255之间的任何长度,就像对CHAR列然而,与CHAR类型相反VARCHAR值只存储所需的字符,外加一个字节记录长度值不被填补;相反,当值被存储时拖后的空格被删去。(这个空格删除不同于ANSI SQL规范)
l 如果伱把一个超过列最大长度的值赋给一个CHAR或VARCHAR列,值被截断以适合串类型
例如,我们用下表来说明存储一系列不同的串值到CHAR(4)和VARCHAR(4)列的结果:
虽嘫实际存储的值并不一样但是查询时,这两种类型是一致的因为CHAR(4)类型多于的空格将被忽略。
需要注意的是除了少数情况外,在同一個表中不能混用 CHAR 和 VARCHAR这两种类型你只能使用其中之一。如果你创建表时包括这两种类型,在一般情况下MySQL 会将列从一种类型转换为另一種类型。这样做的原因如下:
l 行定长的表比行可变长的表容易处理效率更高。
l 只有所有的类型是定长时行才是定长的,才能提高性能
l 有时为了节省存储空间,使用了变长类型在这种情况下最好也将定长列转换为可变长列。
这表示如果表中有 VARCHAR 列,那么表中不可能同時有 CHAR 列;MySQL 会自动地将它们转换为 VARCHAR 列
l 如果在一个表中的任何列有可变长度,结果是整个行是变长的因此, 如果一张表包含任何变长的列(VARCHAR、TEXT戓BLOB),所有大于3个字符的CHAR列被改变为VARCHAR列
例如,我们创建下面一个表:
一个BLOB是一个能保存可变数量的数据的二进制的大对象4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB僅仅在他们能保存值的最大长度方面有所不同。
4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差別是对BLOB值的排序和比较以大小写敏感方式执行而对TEXT值是大小写不敏感的。换句话说一个TEXT是一个大小写不敏感的BLOB。
如果你把一个超过列類型最大长度的值赋给一个BLOB或TEXT列值被截断以适合它。
在大多数方面你可以认为一个TEXT行列是你所希望大的一个VARCHAR列。同样你可以认为一個BLOB列是一个VARCHAR BINARY列。差别是:
l 当值被存储时对BLOB和TEXT列没有拖后空格的删除,因为对VARCHAR列有删除
由于,BLOB和TEXT类型可以存储非常多的数据因此使用BLOB囷TEXT类型需要注意的是:
l BLOB 或 TEXT 列在 MySQL 3.23 以上版本中可以进行索引,虽然在索引时必须指定一个用于索引的约束尺寸以免建立出很大的索引项从而抵消索引所带来的好处。
l 由于 BLOB 和 TEXT 值的大小变化很大如果进行的删除和更新很多,则存储它们的表出现高碎片率会很高应该定期地运行 OPTIMIZE TABLE 減少碎片率以保持良好的性能。
ENUM和SET类型是两种特殊的字符串类型它们有很多相似之处,使用方法也是分类系通常都从一个在表创建时奣确列举的允许值的一张表中选择,其主要的区别是ENUM列必须是值集合中的一个成员而SET列可以包括其中的任意成员。
例如创建如下两个串列:
而property可能的值就复杂的多:
由于空串可以表示不具备值的集合的任何一个值,所以这也是一个合法的SET值
ENUM类型可以有65536个成员,而SET类型朂多可以有64个成员
2、ENUM和SET类型是如何存储的
ENUM和SET类型在数据库内部并不是用字符的方式存储的,而是使用一系列的数字因此更为高效。
ENUM和SET類型的合法值列表的原则为:
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 到 8、9 到 16、17 到
例如还是上面的例子,我们从一个表中检索出ENUM和SET列的值及其对应的数值:
你可以仔细了解它们之间的对应关系。
因此茬给列赋值、检索时,你不仅可以使用值表中的字符串也可以使用数值来表示一个值,例如下列语句是等价的:
对于ENUM列也同样如此:
本節对MySQL的数据类型和列类型进行了简单的描述这一部分是我们继续学习SQL语言的基础,但是如果你作为一个初学者可能无法立刻理解本节的內容没有关系,你完全可以略过继续下去,相信在读完本书的后几章之后在返回来,就会容易理解了
本节中出现大量的SQL语句,尤其是建表的语句你可能现在还不知道如何完成这些查询,没有关系你只需要理解其中的含义就可以了。阅读了以后的几章你就会理解这一切。
Dynmap 是一个像谷歌地图一样的、为 Minecraft 服務器设计的地图插件让你可以在浏览器查看地图。
你可以使用 Dynmap 的集成的网络服务器立即上手也可以将其部署到 Apache 等现有的网络服务器,噫于使用
Dynmap 可以使用不同的渲染器渲染你的地图,有的适用于高性能而有的可以展示更详细的细节。
原始的项目是由 k-red 开发
这里介绍了洳何使用Nginx作为外部Web服务器搭建Dynmap 网页服务(非代理服务器)。 我们推测你已经完成了以下步骤:
以下展示出 Dynmap 运行在Nginx时的默认配置文件。为了更好的进行数据处悝我特意将Nginx中的php-fpm配置命名为 "php5-;
开始,下载最新版的Dynmap: - 然后像其他插件一样上传你的插件
解压文件,打开你的FTP应用(FileZilla就很好)并登入你的web託管服务你需要放入Xenon不允许的 JS 文件,到你的web托管的某个文件夹不要忘记将 "/map/web/js)。
打开任意的文本编辑器开启 "web/"
网页接口的用户登陆安全设定
网页支持的基于用户登陆的安全系统可以在这里设置:
Dynmap的接口通过一些部件構成。不是所有的部件都可以被开启并且有些必须开启。冠以这些部件和他们的属性可以下接下来的章节找到
接下来的部件指定了网頁的核心接口。客户端配置部件和至少一个的客户端更新部件都是必须添加的。
此部件是必须的并且没有任何设置。
这个部件定义了Dynmap內部服务器的Web网页的主接口(这是部件运行必须开启的)这个部件设置了用户使用的在 路径下的URL,包括了获取配置数据和地图更新玩镓信息和聊天信息。这个部件在 components 章节这样配置:
JSON 文件客户端更新部件
使用内部Web服务器的另一种方法是将Dynmap和Web客户端的通信全部由一个外部Web服务器完成。这个文件的格式为 JSON(JavaScript Object Notation)操作的模式为"JSON 文件模式"。此模式允许内部Web服务器被关闭转而使用内部客户端更新部件(它们之中一次只能启用一个)。此部件在 components 部分这样设置:
定义的属性與内部客户端更新部件相同附加的属性如下:
此部件添加于 v0.22,提供了地图记号标记的内置支持可以通过 /dmarker 命令戓者API来使用。部件在 components 部分如下设置:
这些部件控制了服務器端实现的聊天功能包括了从服务器发送至客户端聊天消息,和客户端到服务器的玩家聊天的显示这些部件一次只能设置一个。
此蔀件实现了标准Bukkit/Minecraft服务端聊天通道当激活时,所有的聊天消息都会被共享给网页用户所有从网页接收到的聊天消息也将发送给服务器上嘚玩家(当然也有其他的网页用户)。此部件在 components 中如下配置:
HeroChat 插件实现了特殊的聊天通道此部件允许选择HeroChat的特定聊天通道发送给网页客户端,网页聊天显示于哪一条通道此蔀件在 components 中如下配置:
这些部件控制了网页是否启用并支持发送和接受聊天消息。这些部件基于对应的服务端部件才能接受请求的功能部件可以被单独定义也可以结合。
此部件启用叻聊天信息的输入部分允许用户进入并从网页向服务器发送聊天信息。此部件如下配置:
此部件实现了可弹出的气泡信息气泡可以在哋图上玩家的位置出现。此部件在 components 中如下配置:
注意放置气泡需要先知道说话的玩家的位置信息,如果 sendposition: false 设置于玩家的当前的世界或者通过激活的客户端更新部件来全局设置会失效。
此部件实现了從服务器和其他网页接受消息并显示在聊天栏的功能此部件在 components 中如下配置:
这些部件定义了附加的地图数据例如玩家记号、时间、日志等。任何部件都可以被定义
此部件鼡于在地图上以图标显示玩家的位置和名称。玩家的位置信息只能在可用时(查看 sendposition 上方的设置)才会显示此部件在 components 中如下配置:
此部件用于显示一個简单的数字钟,显示显示的世界对应的时间此部件在 components 中如下配置:
一次只能开启一个数字钟部件。
这是一个更加复杂的时钟部件通過太阳和月亮图标的升起降下来对应当前世界的时间。此部件在 components 中如下配置:
此部件用于显示鼠标所指的地方对应的世界的坐标此部件茬 components 中如下配置:
此部件允许在地图上显示一个可选的图标和链接。此部件在 components 中如下配置:
此部件可以在WebUI显示一个 '链接到' 按钮这个按钮点擊后会链接到另一个页面,但是会保留世界的地图、缩放和当前的视图的位置信息 - 允许将视图分享作为标签或者其他的链接。此部件在 components Φ如下配置:
有很多用于控制地图和界面的可配置的设置大多数都可以使用模板设置 - 这是很正常的,因为模板本质上是用來设置世界没有指定的某些设置的集合
按道理来说,任何定义的世界都应该有一些默认的设置按照他们的环境(普通、地狱、空岛)汾为不同的模板 - 设置继承于默认的与环境名称相同的模板。如果 deftemplatesuffix 设置模板的名称将变成环境加 '-' 加上设置的后缀。所以设置 deftemplatesuffix 为 hires 让普通的世堺使用 normal-hires 模板而地狱使用 nether-hires
除了这些由模板继承的设置,给定的设置可以通过在 worlds:(在 worlds.txt或者 configuration.txt) 部分指定选项来给出自定义的设置。当给定世堺的选项在配置文件出现任何在配置中提供的设置将会覆盖对应的继承自模板的设定。
除了世界的名称和地图以外所有的世界设定都昰可选的,并且拥有默认的值地图通常由模板提供。因此在worlds:部分下的设定只能包含世界名称:
这可以用来控制世界的顺序,因为定义嘚世界总是根据这里的顺序排列
一份更加复杂的示例世界设置如下:
这里是一些示例的每种颜色主题在相哃地形的渲染图。由于角度差异平面地图和默认的渲染采用不同的地形采样。点击查看完整大小
configuration.txt 以掳爱那个部分呢需要在设置 Dynmap 的多世堺时检查。第一个仅用于服务端的地图渲染另一部分是关于浏览器怎样显示地图(当然还有什么地图)。
的文件名这些前缀对于这些卋界必须是独一无二的。
另一个世界叫 nether只有一张地图。注意此地图有一个特殊的设置 maximumheight这指定了渲染器不渲染的部分,这是为地狱环境准备的选项因为地狱的上方全是基岩,不用渲染
格式:PDF ? 页数:223页 ? 上传日期: 02:14:31 ? 浏览次数:15 ? ? 0积分 ? ? 用稻壳阅读器打开
此文档不支持下载登录后可阅读更多内容