我的MYSQL学习心得

更新时间:2024-04-27 16:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

我的MYSQL学习心得

语法的差异

我这里主要说语法的不同 1、默认约束

区别:mysql里面DEFAULT关键字后面是不用加括号的 --sqlserver

CREATE TABLE emp (

id INT DEFAULT(12) )

--mysql

CREATE TABLE emp (

id INT DEFAULT 12)

2、设置自增列

MYSQL的自增列一定要是有索引的列,设置种子值要在表的后面设置 --设置自增列--sqlserver CREATE TABLE emp (

id INT IDENTITY(1, 1) )

--mysql-- 设置自增ID从N开始

CREATE TABLE emp (

ID INT PRIMARY KEY AUTO_INCREMENT

) AUTO_INCREMENT = 100 ; --(设置自增ID从100开始) 设置自增列的步长,可以分为全局级别和会话级别

如果是会话级别,那么当用户新建一个会话的时候,那么步长又回到了全局级别,所以mysql的步长跟sqlserver的步长有很大的不同 mysql不能设置为表级别的步长!!

mysql服务器维护着2种mysql的系统参数(系统变量):全局变量(global variables)和会话变量(session variables)。

它们的含义与区别如其各占的名称所示,session variables是在session级别的,对其的变更只会影响到本session;global variables是系统级别的,

对其的变更会影响所有新session(变更时已经存在session不受影响)至下次mysql server重启动。

注意它的变更影响不能跨重启,要想再mysql server重启时也使用新的值,那么就只有通过在命令行指定变量选项或者更改选项文件来指定, 而通过SET变更是达不到跨重启的。

每一个系统变量都有一个默认值,这个默认值是在编译mysql系统的时候确定的。

对系统变量的指定,一般可以在server启动的时候在命令行指定选项或者通过选项文件来指定

当然,大部分的系统变量,可以在系统的运行时,通过set命令指定其值。 查看系统当前默认的自增列种子值和步长值

SHOW GLOBAL VARIABLES LIKE 'auto_incre%'; -- 全局变量

问:如果有一张表,里面有个字段为id的自增主键,当已经向表里面插入了10条数据之后,删除了id为8,9,10的数据,再把mysql重启,

之后再插入一条数据,那么这条数据的id值应该是多少,是8,还是11?

答:如果表的类型为MyISAM,那么是11。如果表的类型为InnoDB,则id为8。

这是因为两种类型的存储引擎所存储的最大ID记录的方式不同,MyISAM表将最大的ID记录到了数据文件里,重启mysql自增主键的最大ID值也不会丢失;

而InnoDB则是把最大的ID值记录到了内存中,所以重启mysql或者对表进行了OPTIMIZE操作后,最大ID值将会丢失。

顺便说一下MYSQL获取当前表的自增值的四种方法 1、 SELECT MAX(id) FROM person 针对特定表

2、 SELECT LAST_INSERT_ID() 函数 针对任何表 3、 SELECT @@identity 针对任何表

@@identity 是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。

一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。

使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。

4. SHOW TABLE STATUS LIKE 'person' 如果针对特定表,建议使用这一种方法

得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值就是当前该表的最大自增ID.

3、查看表定义 SQLSERVER

EXEC sp_help 'emp'

MYSQL DESC emp

4、修改表名

修改表名也有差异,将表emp改为emp2

--sqlserver

EXEC sys.[sp_rename] @objname = N'emp', -- nvarchar(1035) @newname = 'emp2' -- sysname

--mysql

ALTER TABLE emp RENAME emp2

5、修改字段的数据类型 将id字段的int类型改为bigint

--sqlserver

ALTER TABLE [dbo].[emp2] ALTER COLUMN [ID] BIGINT

--mysql

ALTER TABLE emp2 MODIFY id BIGINT

6、修改字段名

MYSQL里修改字段名的时候需要加上字段的数据类型否则会报错,而CHANGE也可以只修改数据类型,实现和MODIFY同样的效果

方法是将SQL语句中的“新字段名”和“旧字段名”设置为相同的名称,只改变“数据类型” 改变数据类型,例如刚才那个例子,将id列改为bigint数据类型 ALTER TABLE emp2 CHANGE id id BIGINT

修改字段名

--sqlserver

EXEC sys.[sp_rename] @objname = N'emp2.id', -- nvarchar(1035) @newname = 'iid', -- sysname

@objtype = 'column' -- varchar(13)

--mysql

ALTER TABLE emp2 CHANGE id iid BIGINT

7、添加字段

添加字段的语法差不多,但是MYSQL里可以使用FIRST和AFTER关键字指定添加的字段的位置

--sqlserver

ALTER TABLE [dbo].[emp2] ADD NAME NVARCHAR(200) NULL

--mysql

ALTER TABLE emp2 ADD NAME NVARCHAR(200) NULL

8、删除字段

MYSQL删除字段不需要添加COLUMN关键字的 --sqlserver

ALTER TABLE [dbo].[emp2] DROP COLUMN NAME

--mysql

ALTER TABLE emp2 DROP NAME

9、删除外键约束

MYSQL跟SQLSERVER删除约束的方法也有很大的区别

在SQLSERVER里面,无论是唯一约束,check约束还是外键约束都可以使用下面的SQL语句来删除掉

ALTER TABLE 表名 DROP CONSTRAINT 约束名

但是MYSQL里面,如果是外键约束,需要使用 DROP FOREIGN KEY,如果是主键约束需要使用DROP PRIMARY KEY,有点麻烦

--sqlserver

ALTER TABLE dbo.emp2 DROP CONSTRAINT fk_emp_dept

--mysql--删除外键约束

ALTER TABLE emp2 DROP FOREIGN KEY fk_emp_dept --删除主键约束

ALTER TABLE emp2 DROP PRIMARY KEY pk_emp_dept

10、删除表

删除表的语法两个都是一样的 --sqlserver

DROP TABLE [dbo].[emp2]

--mysql

DROP TABLE emp2

但是如果要同时删除多个表或者删除之前要先判断一下,MYSQL就方便多了 --sqlserver

IF (OBJECT_ID('dbo.emp2') IS NOT NULL ) DROP TABLE [dbo].[emp2]

--mysql

DROP TABLE IF EXISTS emp1 ,emp2

SQLSERVER需要一张一张表判断,然后一张一张表drop

MYSQL就不一样,语法非常简洁: DROP TABLE IF EXISTS emp1 ,emp2

总结

这篇文章只是简单介绍了一下MYSQL跟SQLSERVER的语法方面的差异

以后会写更多关于MYSQL跟SQLERVER差异的文章,和我这段时间使用MYSQL期间的一些心得,大家敬请期待o(∩_∩)o

如有不对的地方,欢迎大家拍砖o(∩_∩)o

2014-7-16补充 USE test;

-- myisam引擎

CREATE TABLE TEST(

ID int unsigned not null auto_increment, name varchar(10) not null,

key(name,id))engine=MYISAM auto_increment=100;

-- innodb引擎

CREATE TABLE TESTIdentity(

ID int unsigned not null auto_increment, NID INT UNSIGNED ,

name varchar(10) not null,

key(id))engine=INNODB auto_increment=100;

--或者主键

CREATE TABLE TESTIdentity(

ID int unsigned not null auto_increment, NID INT UNSIGNED ,

name varchar(10) not null,

key(id))engine=INNODB auto_increment=100;

[Database4]ErrorCode: -2147467259, Number: 1075ErrorMessage: Incorrect table definition; there can be only one auto column and it must be defined as a key

alter table TESTIdentity modify column nid int auto_increment;

无论innodb引擎还是MYISAM引擎的表中,只能有一个自增列,并且自增列一定是索引列,无论是二级索引还是主键索引

这里跟SQLSERVER是不一样,SQLSERVER允许一张表有多个自增列,并且不需要在自增列上创建索引 显示宽度

MYSQL中的整数型数据类型都可以指定显示宽度,而SQLSERVER不行

创建一个表

CREATE TABLE tb_emp( id BIGINT(1))

id字段的数据类型为BIGINT(1),注意到后面的数字1,这表示的是该数据类型指定的显示宽度,指定能够显示的数值中数字的个数。

例如,假设声明一个INT类型的字段 YEAR INT(4)

该声明指明,在year字段中的数据一般只显示4位数字的宽度。

在SQLSERVER里是会报错的 CREATE TABLE abc (id INT(11))

消息 2716,级别 16,状态 1,第 1 行

第 1 个列、参数或变量: 不能对数据类型 int 指定列宽。

显示宽度和数据类型的取值范围是无关的。显示宽度只是指明MYSQL最大可能显示的数字个数,数值的位数小于指定的宽度时会有空格填充

如果插入了大于显示宽度的值,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能显示出来。

例如,向year字段插入一个数值19999,当使用select查询的时候,MYSQL显示的将是完整带有5位数字的19999,而不是4位数字的值

如果不指定显示宽度,则MYSQL为每一种类型指定默认的宽度值

tips:显示宽度只用于显示,并不能限制取值范围和占用空间,例如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是INT整型

所允许的最大值。 查看字段的长度 SQLSERVER

USE [sss] GO

SELECT LEN([NAME]) FROM [dbo].[aa]

MYSQL

CREATE TABLE tmp13(vb VARBINARY(10))

INSERT INTO tmp13 (vb) VALUES(12)

SELECT LENGTH(vb) FROM tmp13

INSERT INTO tmp13 (vb) VALUES(1212)

MYSQL里的BLOB数据类型

BLOB是一个二进制大对象,用来存储可变数量的数据。BLOB类型分为4种:TinyBlob、Blob、MediumBlob、LongBlob,

这几个类型之间的唯一区别是在存储文件的最大大小上不同。

MySQL的四种BLOB类型 类型 大小(单位:字节) TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

BLOB列存储的是二进制字符串(字节字符串);TEXT列存储的是非二进制字符串(字符字符串)。 BLOB列没有字符集,并且排序和比较基于列值字节的数值;TEXT列有一个字符集,并且根据字符集对值进行排序和比较

BLOB是二进制字符串,TEXT是非二进制字符串,两者均可存放大容量的信息。BLOB主要存储图片、音频信息等, 而TEXT只能存储文本文件。

SQLSERVER

SQLSERVER并没有BLOB数据类型,只有大型对象数据类型(BLOB): text,ntext,image,nvarchar(max),varchar(max),varbinary(max)和xml数据类型 这些数据类型的数据都存放在LOB类型的数据页面里

如有不对的地方,欢迎大家拍砖o(∩_∩)o 其他类型

第11章:列类型

目录

11.1. 列类型概述

11.1.1. 数值类型概述 11.1.2. 日期和时间类型概述 11.1.3. 字符串类型概述 11.2. 数值类型 11.3. 日期和时间类型

11.3.1. DATETIME、DATE和TIMESTAMP类型

11.3.2. TIME类型 11.3.3. YEAR类型

11.3.4. Y2K事宜和日期类型 11.4. String类型

11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型

11.7. 使用来自其他数据库引擎的列类型

MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。本章首先对这些列类型进行了概述,然后更加详细地描述了各种列的类型,以及列类型存储需求的总结。概述很简单。关于具体列类型的详细信息应查阅详细的描述,例如指定值时允许使用的格式。

MySQL支持处理空间数据的扩展名。关于空间类型的信息参见第19章:MySQL中的空间扩展。 几种列类型描述使用了下述惯例: · M

表示最大显示宽度。最大有效显示宽度是255。

· D

适用于浮点和定点类型,并表示小数点后面的位数。最大可能的值是30,但不应大于M-2。 · 方括号(‘[’和‘]’)表示可选部分。

11.1. 列类型概述

11.1.1. 数值类型概述 11.1.2. 日期和时间类型概述 11.1.3. 字符串类型概述

11.1.1. 数值类型概述

下面为数值列类型的概述。详细信息参见11.2节,“数值类型”。列存储需求参见11.5节,“列类型存储需求”。

M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无

关,相关描述见11.2节,“数值类型”。

如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。 SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。 在整数列定义中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名。

警告:应当清楚,当使用在整数值(其中一个是UNSIGNED类型)之间使用减号时,结果是无符号。参见12.8节,“Cast函数和操作符”。

· BIT[(M)]

位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。 · TINYINT[(M)] [UNSIGNED] [ZEROFILL]

很小的整数。带符号的范围是-128到127。无符号的范围是0到255。 · BOOL,BOOLEAN

是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。 在将来,将根据标准SQL引入完全布尔类型的处理。 · SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。 · MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。 · INT[(M)] [UNSIGNED] [ZEROFILL]

普通大小的整数。带符号的范围是-2147483648到2147483647。无符号的范围是0到4294967295。

· INTEGER[(M)] [UNSIGNED] [ZEROFILL] 这是INT的同义词。

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

大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615。 应清楚BIGINT列的下述内容:

o 使用带符号的BIGINT或DOUBLE值进行所有算法,因此除了位函数,不应使用大于9223372036854775807(63位)的无符号的大整数! 如果这样做,结果中的最后几位可能出错,这是由于将BIGINT值转换为DOUBLE进行四舍五入时造成的错误。 MySQL可以在以下情况下处理BIGINT:

§ 当使用整数在一个BIGINT列保存大的无符号的值时。

§ 在MIN(col_name)或MAX(col_name)中,其中col_name指BIGINT列。 § 使用操作符(+,-,*等等)并且两个操作数均为整数时。

o 总是可以使用一个字符串在BIGINT列中保存严格整数值。在这种情况下,MySQL执行字符串-数字转换,其间不存在双精度表示。

o 当两个操作数均为整数值时,-、+和* 操作符使用BIGINT算法。这说明如果乘两个大整数(或来自返回整数的函数),当结果大于9223372036854775807时,会得到意想不到的结果。 · FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

小(单精度)浮点数。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

M是小数纵位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。

单精度浮点数精确到大约7位小数位。 如果指定UNSIGNED,不允许负值。

使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成。参见A.5.7节,“解决与不匹配行有关的问题”。

· DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]

普通大小(双精度)浮点数。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308

0

2.2250738585072014E-308

1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。

M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。

双精度浮点数精确到大约15位小数位。 如果指定UNSIGNED,不允许负值。

· DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]

为DOUBLE的同义词。除了:如果SQL服务器模式包括REAL_AS_FLOAT选项,REAL是FLOAT的同义词而不是DOUBLE的同义词。

· FLOAT(p) [UNSIGNED] [ZEROFILL]

浮点数。p表示精度(以位数表示),但MySQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。如果p为从0到24,数据类型变为没有M或D值的FLOAT。如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。 FLOAT(p)语法与ODBC兼容。

· DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]

压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和(负数)的‘-’符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。

如果指定UNSIGNED,不允许负值。

所有DECIMAL列的基本计算(+,-,*,/)用65位精度完成。

· DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]

是DECIMAL的同义词。FIXED同义词适用于与其它服务器的兼容性。

11.1.2. 日期和时间类型概述

本节综合讨论了临时列类型。详细信息,参见11.3节,“日期和时间类型”。列存储需求参见11.5节,“列类型存储需求”。

· DATE

日期。支持的范围为'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式显示DATE值,但允许使用字符串或数字为DATE列分配值。 · DATETIME

日期和时间的组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。

· TIMESTAMP[(M)]

时间戳。范围是'1970-01-01 00:00:00'到2037年。

TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。

TIMESTAMP值返回后显示为'YYYY-MM-DD HH:MM:SS'格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。

注释:MySQL 4.1以前使用的TIMESTAMP格式在MySQL 5.1中不支持;关于旧格式的信息参见MySQL 4.1 参考手册。 · TIME

时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式显示TIME值,但允许使

用字符串或数字为TIME列分配值。 · YEAR[(2|4)]

两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000。在两位格式中,允许的值是70到69,表示从1970年到2069年。MySQL以YYYY 格式显示YEAR值,但允许使用字符串或数字为YEAR列分配值。

11.1.3. 字符串类型概述

本节综合讨论了字符串列类型。详细信息参见11.4节,“String类型”。列存储需求参见11.5节,“列类型存储需求”。

在某些情况中,MySQL可以将一个字符串列更改为不同于CREATE TABLE或ALTER TABLE语句中所给出的类型。参见13.1.5.1节,“沉寂的列规格变更”。

MySQL 5.1字符串数据类型包括部分在MySQL 4.1之前的版本中没有的特性:

· 许多字符串数据类型的列定义可以包括指定字符集的CHARACTER SET属性,也可能包括校对规则。(CHARSET是CHARACTER SET的一个同义词)。这些属性适用于CHAR、VARCHAR、TEXT类型、ENUM和SET。例如: · CREATE TABLE t · (

· c1 CHAR(20) CHARACTER SET utf8,

· c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin

· );

该表定义创建了一个名为c1的列,具有一个utf8字符集和该字符集的默认 校对规则,和一个名为c2的列以及latin1字符集和该字符集的二元 校对规则。二元校对规则对大小写不敏感。 · MySQL 5.1用字符单位解释在字符列定义中的长度规范。(以前的一些MySQL版本以字节解释长度)。

· 对于CHAR、VARCHAR和TEXT类型,BINARY属性可以为列分配该列字符集的 校对规则。

· 字符列的排序和比较基于分配给列的字符集。在以前的版本中,排序和比较基于服务器字符集的校对规则。对于CHAR和VARCHAR 列,你可以用BINARY属性声明列让排序和 校对规则使用当前的字符代码值而不是词汇顺序。

关于MySQL 5.1中字符集的支持,参见第10章:字符集支持。 · [NATIONAL] CHAR(M) [BINARY| ASCII | UNICODE]

固定长度字符串,当保存时在右侧填充空格以达到指定的长度。M表示列长度。M的范围是0到255个字符。

注释:当检索CHAR值时尾部空格被删除。

如果想要将某个CHAR的长度设为大于255,执行的CREATE TABLE或ALTER TABLE语句将失败并提示错误:

mysql> CREATE TABLE c1 (col1 INT, col2 CHAR(500));

ERROR 1074 (42000): Column length too big for column 'col' (max = 255); use BLOB or TEXT instead

mysql> SHOW CREATE TABLE c1;

ERROR 1146 (42S02): Table 'test.c1' doesn't exist

CHAR是CHARACTER的简写。NATIONAL CHAR(或其等效短形式NCHAR)是标准的定义CHAR列应使用 默认字符集的SQL方法。这在MySQL中为默认值。

BINARY属性是指定列字符集的二元 校对规则的简写。排序和比较基于数值字符值。 列类型CHAR BYTE是CHAR BINARY的一个别名。这是为了保证兼容性。 可以为CHAR指定ASCII属性。它分配latin1字符集。 可以为CHAR指定UNICODE属性。它分配ucs2字符集。

MySQL允许创建类型CHAR(0)的列。这主要用于必须有一个列但实际上不使用值的旧版本的应用程序相兼容。当你需要只能取两个值的列时也很好:没有定义为NOT NULL的一个CHAR(0)列只占用一位,只可以取值NULL和''(空字符串)。 · CHAR 这是CHAR(1)的同义词。

· [NATIONAL] VARCHAR(M) [BINARY]

变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。

注释:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。 VARCHAR是字符VARYING的简写。

BINARY属性是指定列的字符集的二元 校对规则的简写。排序和比较基于数值字符值。 VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。 · BINARY(M)

BINARY类型类似于CHAR类型,但保存二进制字节字符串而不是非二进制字符串。 · VARBINARY(M)

VARBINARY类型类似于VARCHAR类型,但保存二进制字节字符串而不是非二进制字符串。 · TINYBLOB

最大长度为255(28–1)字节的BLOB列。 · TINYTEXT

最大长度为255(28–1)字符的TEXT列。 · BLOB[(M)]

最大长度为65,535(216–1)字节的BLOB列。

可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。

· TEXT[(M)]

最大长度为65,535(216–1)字符的TEXT列。

可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。 · MEDIUMBLOB

最大长度为16,777,215(224–1)字节的BLOB列。 · MEDIUMTEXT

最大长度为16,777,215(224–1)字符的TEXT列。 · LONGBLOB

最大长度为4,294,967,295或4GB(232–1)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。 · LONGTEXT

最大长度为4,294,967,295或4GB(232–1)字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。 · ENUM('value1','value2',...)

枚举类型。只能有一个值的字符串,从值列'value1','value2',...,NULL中或特殊 ''错误值中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。 · SET('value1','value2',...)

一个设置。字符串对象可以有零个或多个值,每个值必须来自列值'value1','value2',...SET列最多可以有64个成员。SET值在内部用整数表示。

11.2. 数值类型

MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。 BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。

作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。

类型 字节 最小值 最大值

(带符号的/无符号的) (带符号的/无符号的)

TINYINT 1 -128 127

0 255

SMALLINT 2 -32768 32767

0 65535

MEDIUMINT 3 -8388608 8388607

0 16777215

INT 4 -2147483648 2147483647

0 4294967295

BIGINT 8 -9223372036854775808 9223372036854775807

0 18446744073709551615

MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4))。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。

显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。 当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。 所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。

浮点和定点类型也可以为UNSIGNED。同数类型,该属性防止负值保存到列中。然而,与整数类

型不同的是,列值的上范围保持不变。

如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。 对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。

FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。

MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。

MySQL将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词。MySQL还将REAL视为DOUBLE PRECISION(非标准扩展)的同义词,除非SQL服务器模式包括REAL_AS_FLOAT选项。 为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数。

DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如: salary DECIMAL(5,2)

在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的

位数。

在MySQL 5.1中以二进制格式保存DECIMAL和NUMERIC值。

标准SQL要求salary列能够用5位整数位和两位小数保存任何值。因此,在这种情况下可以保存在salary列的值的范围是从-999.99到999.99。

在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)。同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC数据类型的变量形式。M默认值是10。

DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。 BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1到64。

要指定位值,可以使用b'value'符。value是一个用0和1编写的二进制值。例如,b'111'和b'100000000'分别表示7和128。参见9.1.5节,“位字段值”。

如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b'101',其效果与分配b'000101'相同。

当要在一个数值列内保存一个超出该列允许范围的值时,MySQL的操作取决于此时有效的SQL模式。如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。但是,如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准

插入会失败。参见5.3.2节,“SQL服务器模式”。

如果INT列是UNSIGNED,列范围的大小相同,但其端点会变为到0和4294967295。如果你试图保存-9999999999和9999999999,以非严格模式保存到列中的值是0和4294967296。 如果在浮点或定点列中分配的值超过指定(或默认)精度和标度规定的范围,MySQL以非严格模式保存表示范围相应端点的值。

当MySQL没有工作在严格模式时,对于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT语句,由于裁剪发生的转换将报告为警告。当MySQL工作在严格模式时,这些语句将失败,并且部分或全部值不会插入或更改,取决于是否表为事务表和其它因素。详情参见5.3.2节,“SQL服务器模式”。

11.3. 日期和时间类型

11.3.1. DATETIME、DATE和TIMESTAMP类型 11.3.2. TIME类型 11.3.3. YEAR类型

11.3.4. Y2K事宜和日期类型

表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。TIMESTAMP类型有专有的自动更新特性,将在后面描述。

如果试图插入一个不合法的日期,MySQL将给出警告或错误。可以使用ALLOW_INVALID_DATES SQL模式让MySQL接受某些日期,例如'1999-11-31'。当你想要保

存一个“可能错误的”用户已经在数据库中指定(例如,以web形式)用于将来处理的值时很有用。在这种模式下,MySQL只验证月范围为从0到12,日范围为从0到31。这些范围可以包括零,因为MySQL允许在DATE或DATETIME列保存日/月和日是零的日期。这在应用程序需要保存一个你不知道确切日期的生日时非常有用。在这种情况下,只需要将日期保存为'1999-00-00'或'1999-01-00'。如果保存此类日期,DATE_SUB()或DATE_ADD等需要完整日期的函数不会得到正确的结果。(如果你不想在日期中出现零,可以使用NO_ZERO_IN_DATE SQL模式)。 MySQL还允许将'0000-00-00'保存为“伪日期”(如果不使用NO_ZERO_DATE SQL模式)。这在某些情况下比使用NULL值更方便(并且数据和索引占用的空间更小)。

将sql_mode系统变量设置为相应模式值,可以更确切你想让MySQL支持哪种日期。参见5.3.2节,“SQL服务器模式”。

当使用日期和时间类型时应记住以下几点:

· MySQL以标准输出格式检索给定日期或时间类型的值,但它尽力解释你指定的各种输入值格式(例如,当你指定一个分配给或与日期或时间类型进行比较的值时)。只支持下面章节中描述的格式。期望你能提供有效值。如果你使用其它格式的值会发生意想不到的结果。 · 包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:

o 70-99范围的年值转换为1970-1999。 o 00-69范围的年值转换为2000-2069。

· 尽管MySQL尝试解释几种格式的值,日期总是以年-月-日顺序(例如,'98-09-04'),而不是其它地方常用的月-日-年或日-月-年顺序(例如,'09-04-98','04-09-98')。

· 如果值用于数值上下文中,MySQL自动将日期或时间类型的值转换为数字,反之亦然。 · 当 MySQL遇到一个日期或时间类型的超出范围或对于该类型不合法的值时(如本节开始所描述),它将该值转换为该类的“零”值。一个例外是超出范围的TIME值被裁剪到TIME范围的相应端点。

下面的表显示了各类“零”值的格式。请注意如果启用NO_ZERO_DATE SQL模式,使用这些值会产生警告。

列类型 “零”值 DATETIME '0000-00-00 00:00:00' DATE '0000-00-00' TIMESTAMP 00000000000000 TIME '00:00:00' YEAR 0000 · “零”值是特殊值,但你可以使用表内显示的值显式保存或引用它们。你也可以使用

值'0'或0来保存或引用,写起来更容易。

· MyODBC中使用的“零”日期或时间值在MyODBC 2.50.12和以上版本中被自动转换为NULL,因为ODBC不能处理此类值。

11.3.1. DATETIME、DATE和TIMESTAMP类型

11.3.1.1. 自MySQL 4.1以来的TIMESTAMP属性

DATETIME、DATE和TIMESTAMP类型是相关的。该节描述了它们的特征,它们的相似点和不同点。

当你需要同时包含日期和时间信息的值时则使用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列类型的属性不固定,取决于MySQL版本和服务器运行的SQL模式。这些属性将在本节后面描述。

可以使用任何常见格式指定DATETIME、DATE和TIMESTAMP值:

· 'YYYY-MM-DD HH:MM:SS'或'YY-MM-DD HH:MM:SS'格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+45'、'98/12/31 11*30*45'和'98@12@31 11^30^45'是等价的。

· 'YYYY-MM-DD'或'YY-MM-DD'格式的字符串。这里也允许使用“不严格的”语法。例如,'98-12-31'、'98.12.31'、'98/12/31'和'98@12@31'是等价的。

· 'YYYYMMDDHHMMSS'或'YYMMDDHHMMSS'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523091528'和'970523091528'被解释为'1997-05-23 09:15:28',但'971122129015'是不合法的(它有一个没有意义的分钟部分),将变为'0000-00-00 00:00:00'。

· 'YYYYMMDD'或'YYMMDD'格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,'19970523'和'970523'被解释为 '1997-05-23',但'971332'是不合法的(它有一个没有意义的月和日部分),将变为'0000-00-00'。

· YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有意义的。例如,19830905132800和830905132800被解释为 '1983-09-05 13:28:00'。 · YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有意义的。例如,19830905和830905被解释为'1983-09-05'。

· 函数返回的结果,其值适合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE。

无效DATETIME、DATE或者TIMESTAMP值被转换为相应类型的“零”值('0000-00-00 00:00:00'、'0000-00-00'或者00000000000000)。

对于包括日期部分间割符的字符串值,如果日和月的值小于10,不需要指定两位数。'1979-6-9'

与'1979-06-09'是相同的。同样,对于包括时间部分间割符的字符串值,如果时、分和秒的值小于10,不需要指定两位数。'1979-10-30 1:2:3'与'1979-10-30 01:02:03'相同。

数字值应为6、8、12或者14位长。如果一个数值是8或14位长,则假定为YYYYMMDD或YYYYMMDDHHMMSS格式,前4位数表示年。如果数字 是6或12位长,则假定为YYMMDD或YYMMDDHHMMSS格式,前2位数表示年。其它数字被解释为仿佛用零填充到了最近的长度。 指定为非限定符字符串的值使用给定的长度进行解释。如果字符串为8或14字符长,前4位数表示年。否则,前2位数表示年。从左向右解释字符串内出现的各部分,以发现年、月、日、小时、分和秒值。这说明不应使用少于6字符的字符串。例如,如果你指定'9903',认为它表示1999年3月,MySQL将在你的表内插入一个“零”日期值。这是因为年和月值是99和03,但日部分完全丢失,因此该值不是一个合法的日期。但是,可以明显指定一个零值来代表缺少的月或日部分。例如,可以使用'990300'来插入值'1999-03-00'。

在一定程度上,可以将一个日期类型的值分配给一个不同的日期类型。但是,值可能会更改或丢失一些信息:

· 如果你为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为'00:00:00',因为DATE值未包含时间信息。

· 如果你为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为DATE值未包含时间信息。

· 记住尽管可以使用相同的格式指定DATETIME、DATE和TIMESTAMP值,不同类型的值的范围却不同。例如,TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如

'1968-01-01',虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。 当指定日期值时请注意某些缺陷:

· 指定为字符串的值允许的非严格格式可能会欺骗。例如,值'10:11:12'由于‘:’间割符看上去可能象时间值,但如果用于日期上下文值则被解释为年'2010-11-12'。值'10:45:15'被转换为'0000-00-00'因为'45'不是合法月。

· 在非严格模式,MySQL服务器只对日期的合法性进行基本检查:年、月和日的范围分别是1000到9999、00到12和00到31。任何包含超出这些范围的部分的日期被转换成'0000-00-00'。请注意仍然允许你保存非法日期,例如'2002-04-31'。要想确保不使用严格模式时日期有效,应检查应用程序。

在严格模式,非法日期不被接受,并且不转换。 详细信息参见5.3.2节,“SQL服务器模式”。

· 包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:

o 00-69范围的年值转换为2000-2069。 o 70-99范围的年值转换为1970-1999。 11.3.1.1. 自MySQL 4.1以来的TIMESTAMP属性

注释:在旧版本的MySQL中(4.1之前),TIMESTAMP列类型的属性在许多方面于本节所描述的

大大不同。如果你需要对旧的TIMESTAMP数据进行转化以便在MySQL 5.1中工作,详情请参见MySQL 4.1 参考手册。

TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。

MySQL服务器也可以以MAXDB模式运行。当服务器以该模式运行时,TIMESTAMP与DATETIME相等。也就是说,如果创建表时服务器以MAXDB模式运行,TIMESTAMP列创建为DATETIME列。结果是,该列使用DATETIME显示格式,有相同的值范围,并且没有自动对当前的日期和时间进行初始化或更新。

要想启用MAXDB模式,在启动服务器时使用--sql-mode=MAXDB服务器选项或在运行时通过设置全局sql_mode变量将SQL服务器模式设置为MAXDB: mysql> SET GLOBAL sql_mode=MAXDB;

客户端可以按照下面方法让服务器为它的连接以MAXDB模式运行: mysql> SET SESSION sql_mode=MAXDB;

MySQL不接受在日或月列包括一个零或包含非法日期值的时间戳值。该规则的唯一例外是特殊值'0000-00-00 00:00:00'。

你可以非常灵便地确定什么时候初始化和更新TIMESTAMP和对哪些列进行初始化和更新: · 你可以将当前的时间戳指定为默认值和自动更新的值。但只能选择一个,或者两者都

不选。(不可能一个列选择一个行为而另一个列选择另一个行为)。

· 你可以指定哪个TIMESTAMP列自动初始化或更新为当前的日期和时间。不再需要为第1个TIMESTAMP列。

请注意下面讨论所信息只适用于创建时未启用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列创建为DATETIME列)。控制TIMESTAMP列的初始化和更新的规则如下所示: · 如果一个表内的第1个TIMESTAMP列指定为一个DEFAULT值,则不能忽略。 默认值可以为CURRENT_TIMESTAMP或常量日期和时间值。

· DEFAULT NULL与第1个TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。对于其它TIMESTAMP列,DEFAULT NULL被视为DEFAULT 0。

· 表内的任何一个TIMESTAMP列可以设置为自动初始化为当前时间戳和/或更新。 · 在CREATE TABLE语句中,可以用下面的任何一种方式声明第1个TIMESTAMP列: o 用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列为默认值使用当前的时间戳,并且自动更新。

o 不使用DEFAULT或ON UPDATE子句,与DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP相同。

o 用DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列为默认值使用当前的时间戳但是不自动更新。

o 不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有默认值0并

本文来源:https://www.bwwdw.com/article/s4cg.html

Top