一个集合。一个能有零个或更多个值的字符串对象,其中每个值必须选自值列''''value1''''、''''value2''''、...。一个 SET 列可以有最大 64 个成员。查看章节 6.2.3.4 SET 类型。
6.2.1 数字类型
MySQL 支持所有的 ANSI/ISO SQL92 数字类型。这些类型包括准确数字的数据类型(NUMERIC、DECIMAL、INTEGER 和 SMALLINT),也包括近似数字的数据类型(FLOAT、REAL和 DOUBLE PRECISION)。关键词 INT 是 INTEGER 的同义词,关键词 DEC 是 DECIMAL 的同义词。
NUMERIC 和 DECIMAL 类型被 MySQL 以同样的类型实现,这在 SQL92 标准中是允许的。他们用于保存对准确精度有重要要求的值,例如与金钱有关的数据。当以它们中的之一声明一个列时,精度和数值范围可以(通常是)被指定;例如:
salary DECIMAL(5,2)
在这个例子中,5 (精度(precision)) 代表重要的十进制数字的数目,2 (数据范围(scale)) 代表在小数点后的数字位数。在这种情况下,因此,salary 列可以存储的值范围是从 -99.99 到 99.99。(实际上 MySQL 在这个列中可以存储的数值可以一直到 999.99,因为它没有存储正数的符号)。
译者注:
M 与D 对DECIMAL(M, D) 取值范围的影响
类型说明 取值范围(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
# 在MySQL 3.23 及以后的版本中,DECIMAL(M, D) 的取值范围等于早期版本中的DECIMAL(M + 2, D) 的取值范围。
注释结束:
在 ANSI/ISO SQL92 中,句法 DECIMAL(p) 等价于 DECIMAL(p,0)。同样的,在执行被允许决定值 p 的地方,句法 DECIMAL 等价于 DECIMAL(p,0)。MySQL 目前还不支持 DECIMAL/NUMERIC 数据类型的这些变体形式中的任一种。一般来说这并不是一个严重的问题,通过明确地控制精度和数值范围可以得到这些类型的主要功能益处。
DECIMAL 和 NUMERIC 值是作为字符串存储的,而不是作为二进制浮点数,以便保护这些值的十进制精确度。一个字符用于数值的每一位、小数点(如果 scale > 0) 和 “-” 符号(对于负值)。如果 scale 是 0,DECIMAL 和 NUMERIC 值不包含小数点或小数部分。
DECIMAL 和 NUMERIC 值的最大范围与 DOUBLE 一致,但是对于一个给定的 DECIMAL 或 NUMERIC 列,它的实际范围可制定该列时的 precision 或 scale 限制。当这样的列被赋给了小数点的位数超过 scale 所指定的值时,该将根据 scale 进行四舍五入。当一个 DECIMAL 或 NUMERIC 列被赋与一个大小超过指定(或缺省)的 precision and scale 的限止范围时,MySQL 以该列范围的端点值存储该值。
示例(译者注):
mysql> CREATE TABLE `tA` (
-> `id` int(4) unsigned zerofill NOT NULL,
-> `salary` decimal(5,2),
-> PRIMARY KEY (`id`)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `tA` (`id`, `salary`)
-> VALUES (1, -99.99), # 以数字方式插入
-> (2, "99.99"), # 以字符串方式插入
-> (3, -999.99),
-> (4, "9999.99"),
-> (5, -1000.00), # decimal(5,2)最小范围为 -999.99 该值插入时结果为 -999.99
-> (6, "10000.00"), # decimal(5,2)最大范围为 9999.99 该值插入时结果为 9999.99
-> (7, "-99.999"), # 小数位数超过 scale 指定值,但因以字符串方式插入,结果值仅截去多余部分
-> (8, "99.9999"),
-> (9, -99.999), # 小数位数超过 scale 指定值,对该值进行四舍五入,结果为 -100.00
-> (10,99.9999);
Query OK, 10 rows affected (0.00 sec)
Records: 10 Duplicates: 0 Warnings: 4
mysql> SELECT * FROM `tA`;
+------+---------+
| id | salary |
+------+---------+
| 0001 | -99.99 |
| 0002 | 99.99 |
| 0003 | -999.99 |
| 0004 | 9999.99 |
| 0005 | -999.99 |
| 0006 | 9999.99 |
| 0007 | -99.99 |
| 0008 | 99.99 |
| 0009 | -100.00 |
| 0010 | 100.00 |
+------+---------+
10 rows in set (0.00 sec)
* 以上结果在 MySQL 4.0.12 中测试
示例结束(译者注)
作为对 ANSI/ISO SQL92 标准的一个扩展,MySQL 也支持上面的表格所列出的整型类型 TINYINT、MEDIUMINT 和 BIGINT。另外一个扩展是 MySQL 支持随意指定一个整型数值的显示格式,这通过在类型的基本关键词后跟一个括号来实现(例如 INT(4))。这个可选的宽度规格说明是用于在数值显示时,对某些值的宽度短于该列宽度的值进行左填补显示的,而不是为了限制在该列中存储值的宽度,也不是为了限制那些超过该列指定宽度的值的可被显示的数字位数。当与可选的扩展属性 ZEROFILL 一起使用时,缺省填补用的空格被零代替。举例来说,一个列被定义为 INT(5) ZEROFILL,插入的值 4 被检索出来时为 00004。注意,如果在一个整型列中存储一个超过显示宽度的更大值时,当 MySQL 为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,MySQL 信任地认为所有的值均适合原始的列宽度。
示例(译者注):
mysql> CREATE TABLE `tA` (
-> `id` int(4) unsigned zerofill NOT NULL,
-> PRIMARY KEY (`id`)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `tA` (`id`)
-> VALUES (1),(12),(1234),(12345678);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM `tA`;
+----------+
| id |
+----------+
| 0001 |
| 0012 |
| 1234 |
| 12345678 |
+----------+
4 rows in set (0.00 sec)
* 以上结果在 MySQL 4.0.12 中测试
示例结束(译者注)
所有的整型类型可以有一个可选(非标准的)属性 UNSIGNED。如果希望在一个列中只允许正值并且需要一个稍大一点的数字范围,就可以使用无符号值。
从 MySQL 4.0.2 开始,浮点类型也可以存在 UNSIGNED。
与整型类型一致的,这个属性可以防止在该列中存在负值。而与整型类型不一致的,该列的高部范围仍然与原范围保持一致。
FLOAT 类型被用于表示近似数字的数值类型。ANSI/ISO SQL92 标准允许一个可选的精度说明(但不是指数的范围),跟在 关键词 FLOAT 后的括号内。MySQL 实现也支持这个可选的精度规格说明。当关键词被用于一个列的类型说明而没有精度规格说明时,MySQL 使用四个字节来存储该字段值。在关键词 FLOAT 后的括号里给出两个数字,这种变形的句法也是被支持的。使用这个选项时,第一个数字继续表示值存储所占的字节数,第二个数字指定能被存储和显示的跟随在小数点后的位数(就像 DECIMAL 和 NUMERIC)。当 MySQL 被要求为这样的一个列存储一个小数点后的小数位数超过指定值的数值时,该值将会被四舍五入,去除额外的位。
示例(译者注):
mysql> CREATE TABLE `tA` (
-> `id` int(4) unsigned zerofill NOT NULL,
-> `float_date` float(4,2) unsigned NOT NULL,
-> PRIMARY KEY (`id`)
-> ) TYPE=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO `tA` (`id`,`float_date`)
-> VALUES (1, -100), # 插入无效的负值
-> (2, 100.99), # 以数字方式插入
-> (3, "100.99"), # 以字符串方式插入
-> (4, "100.99999"), # 小数位数超过指定倍数,该值进行四舍五入
-> (5, 100.99999),
-> (6, "100.9911"),
-> (7, 100.9911);
Query OK, 7 rows affected (0.00 sec)
Records: 7 Duplicates: 0 Warnings: 1
mysql> SELECT * FROM `tA`;
+------+------------+
| id | float_date |
+------+------------+
| 0001 | 0.00 |
| 0002 | 100.99 |
| 0003 | 100.99 |
| 0004 | 101.00 |
| 0005 | 101.00 |
| 0006 | 100.99 |
| 0007 | 100.99 |
+------+------------+
7 rows in set (0.00 sec)
* 以上结果在 MySQL 4.0.12 中测试
示例结束(译者注)
REAL 和 DOUBLE PRECISION 类型不接受精度规格说明。作为对 ANSI/ISO SQL92 标准的扩展,MySQL 接受 DOUBLE 作为 DOUBLE PRECISION 类型的一个同义词。标准要求 REAL 的精度比用于 DOUBLE PRECISION 的更小,而与之相反的,MySQL 以 8 字节的双精度浮点值(当不以“ANSI 模式”运行时)来实现两者。为了得到最大的可移植性, 近似数字的数值存储所需代码应该使用没有精度或小数位数规格说明的 FLOAT 或 DOUBLE PRECISION 类型。
当试图在一个数字列中存储一个超过该列允许范围的值时,MySQL 会剪切该值到范围内的适当端点值,并以结果值代替存储。
举例来说,一个整型列的范围是 -2147483648 到 2147483647。如果试图在一个 INT 列中插入值 -9999999999,该值将会被剪切到该范围的低部端点,以 -2147483648 代替存储。同样的,如果试图插入 9999999999,2147483647 将被代替存储。
如果 INT 列是 UNSIGNED的,列的范围大小是一致的,不过它的端点移动到了 0 和 4294967295。如果你试图存储 -9999999999 和 9999999999,而实际列中存储的值将会变成 0 和 4294967296。
对于 ALTER TABLE、LOAD DATA INFILE、UPDATE 和多行 INSERT 语句,由于剪切发生的转换,将以“Warnings”被报告。
类型 占用字节 从 到
TINYINT 1 -128 127
SMALLINT 2 -32768 32767
MEDIUMINT 3 -8388608 8388607
INT 4 -2147483648 2147483647
BIGINT 8 -9223372036854775808 9223372036854775807
6.2.2 Date 和 Time 类型
日期和时间类型有 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。每一个类型均有合法值的范围,当给它们赋于一个真正不合法的值时,这些值将会被“零”代替。注意,MySQL 允许存储某个“不严格地”合法的日期,例如 1999-11-31。这样做的原因是,我们认为应用程序有责任来处理日期合法性的检查,而不是由 SQL 服务器来处理。为了“加快”对日期的检查,MySQL 仅检查月份应在 0-12 范围内,以及天在 0-31 范围内。因为上面所述的范围定义方式,MySQL 因而允许你在一个 DATE 或 DATETIME 列中存储日或月日均为 0 的日期。当一个应用程序希望存储一个出生日期,而你并不知准确的出生日月时,这将变得非常有用。在这种情况下,你可以简单地以 1999-00-00 或 1999-01-00 形式存储日期。(当然你不能期望 DATE_SUB() 或 DATE_ADD 之类的函数能正确地处理这样的日期,并得到正确的值。)
当使用日期和时间类型工作时,这里有一些要记住的总则:
-
MySQL 对一个给定的日期或时间类型以标准的格式进行检索,但是它会努力以各种格式匹配解释你所提供的(例如,当你指定一个值,将其赋给一个日期或时间类型或与之比较时)。然而,只在下面部分所描述的格式是被支持的。期望你能够提供合法的值,如果你使用其它格式的值,可能会造成无法预料的结果。
-
尽管 MySQL 会尝试以各种格式解释值,它通常期望日期的年部分放在最左边。日期必须以年-月-日次序给出(例如,
''''98-09-04''''),而不是其它地方常用的月-日-年或日-月-年次序(例如,''''09-04-98''''、''''04-09-98'''')。
-
如果一个值被用于在数字的语境中,MySQL 将自动地将一个日期或时间类型值转换成数字,反之亦然。
-
当 MySQL 遇到一个日期或时间类型的值超出范围或对该类型是一个不合法的值时(查看这个章节的开头部分),它会将该类型的值变换到“零”值。(例外的是超出范围的
TIME 值将被剪切为适当的 TIME 范围端点值。) 下表每种类型的“零”值格式:
列类型 “零”值
DATETIME ''''0000-00-00 00:00:00''''
DATE ''''0000-00-00''''
TIMESTAMP 00000000000000 (长度取决于显示格式)
TIME ''''00:00:00''''
YEAR 0000
-
“零”值是特殊的,但是你可以以表中显示的值来明确地存储或引用他们。你也可以使用值
''''0'''' 或 0,这更易于书写。
-
在
MyODBC 2.50.12 和以上的版本中,“零”值的日期和时间值通过 MyODBC 将被自动转换成 NULL,因为 ODBC 不能够处理这样的值。
6.2.2.1 Y2K 问题和日期类型
MySQL 自身是 Y2K 安全的(查看章节 1.2.5 2000 年兼容性),但是呈交给 MySQL 的值可能并不是。任何一个包含 2 位年份的值是存在二义性的,因为世纪值是未知的。这样的值必须被解释为 4 位格式,因为 MySQL 内部使用四位存储年份。
对于 DATETIME、DATE、TIMESTAMP 和 YEAR 类型,MySQL 使用下列规
上一页 [1] [2] [3] [4] [5] 下一页
[MySql]PHP存取 Mysql 数据乱码终极解决方案 [MySql]解决Table xxx is marked as crashed and should …
[MySql][MySQL]快速解决"is marked as crashed and shoul… [MySql]MySQL DELETE语法用法详解
[MySql]mysql中时间日期格式化 [MySql]修改mysql导入文件大小限制
[其他]MySql常用命令大全 [Web开发]把ACCESS的数据导入到Mysql中的方法详解
[MySql]解决mysql 1040错误Too many connections的方法 [系统软件]利用crontab系统每天定时备份MySQL数据库