分享

CH 11 列的类型

 元傲一 2006-03-24
 

Chapter 11. Column Types

Table of Contents

11.1. Column Type Overview

11.1.1. Overview of Numeric Types

11.1.2. Overview of Date and Time Types

11.1.3. Overview of String Types

11.2. Numeric Types

11.3. Date and Time Types

11.3.1. The DATETIME, DATE, and TIMESTAMP Types

11.3.2. The TIME Type

11.3.3. The YEAR Type

11.3.4. Y2K Issues and Date Types

11.4. String Types

11.4.1. The CHAR and VARCHAR Types

11.4.2. The BINARY and VARBINARY Types

11.4.3. The BLOB and TEXT Types

11.4.4. The ENUM Type

11.4.5. The SET Type

11.5. Column Type Storage Requirements

11.6. Choosing the Right Type for a Column

11.7. Using Column Types from Other Database Engines

MySQL支持几种类类型,每种类型里又有若干种类别:numeric types, date and time types, and string (character) types. 本章首先概览这些列类型,然后给出详细的介绍。

MySQL 5.0 支持处理空间数据的扩展。有关空间类型见: Chapter 17, Spatial Extensions in MySQL.

一些列类型描述使用如下约定:

 M

表示最大长度。最大的合法的显示长度是255

D

用于浮点类型和定点类型,表示小数点之后的数字位数。最大可能值是30,但是最好不要超过M-2.

  • 方括号 (‘[’ and ‘]’) 表示类型指示器的可选部分。

11.1. Column Type Overview

11.1.1. Overview of Numeric Types

下面是数字类型的总结。详细信息见: Section 11.2, “Numeric Types”. 列的存储要求见: Section 11.5, “Column Type Storage Requirements”.

 

如果你给数字列指定了 ZEROFILL, MySQL会自动给这个列赋属性值为UNSIGNED.

SERIAL BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的别名。

整数列的定义中SERIAL DEFAULT VALUE NOT NULL AUTO_INCREMENT UNIQUE的别名.

警告: 当你在两个整数值之间使用减法运算时,如果一个是UNSIGNED类型,那么结果是UNSIGNED类型。见:Section 12.8, “Cast Functions and Operators”.

  • BIT[(M)]

A bit-field type. M 表示每个值的bit数,从164。默认是1

这个数值类型在 MySQL 5.0.3 中出项,属于 MyISAM, 5.0.5 中扩展到了 MEMORY, InnoDB, and BDB. 5.0.3之前, BIT is TINYINT(1)的同义词。

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

一个很小的整数。其有符号值的范围是 -128 127. 无符号值的范围是 0 255.

  • BOOL, BOOLEAN

他们是 TINYINT(1)的同义词。0值认为是false。非0值认为是true.

In the future, full boolean type handling will be introduced in accordance with standard SQL.

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

小整数。有符号值的范围是-32768 to 3276.。无符号值的范围是0 to 65535

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

中等大小(medium-size)的整数。有符号值的范围是-8388608 to 8388607。无符号值的范围是0 to 16777215

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

一般大小(normal-size)的整数. The signed range is -2147483648 to 2147483647. The unsigned range is 0 to 4294967295.

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

INT的同义词。

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

一个大整数。有符号值的范围是-9223372036854775808 to 9223372036854775807。无符号值的范围是0 to 18446744073709551615.

对于BIGINT列,你应该注意以下问题:

    • 所有算术使用 BIGINT DOUBLE , 所以你不能使用大于9223372036854775807 (63 bits)的无符号值,除非使用bit函数/功能(function)。如果你那样做了,结果中的最后几位数字可能会是错的。因为当把BIGINT值转换为DOUBLE值时出现的取正错误。

MySQL 5.0 在下列情况下可以处理BIGINT 

      • 当使用整数在BIGINT列存储大的无符号值时。
      • MIN(col_name) MAX(col_name), 如果col_name涉及到一个BIGINT .
      • 当使用操作符 (+, -, *, and so on)时,而且两个操作数都是整数。  
    • 你总是通过存储一个字符串存储一个精确的整数值到BIGINT列中。这样, MySQL 执行一个字符串到数值的转换。这不涉及到双精确度的表示。(that involves no intermediate double-precision representation.
    • 当两个操作数都是整数值时,-, +, * 操作符使用BIGINT进行算术。这表示如果你对两个大整数相乘,当结果大于9223372036854775807时,你会得到一个预想不到的结果。
  • FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]

小的(单精度)的数字。范围是-3.402823466E+38 -1.175494351E-38, 0, 1.175494351E-38 3.402823466E+38.这些是基于IEEE标准的理论上的限制。实际的范围可能稍微小些,这取决于你的硬件和操作系统。  

M 是小说的总位数。 D是小数点之后的数字位数。如果MD漏写了,那么缺省的限制是你的硬件决定的。单精度的浮点数精确到大约小数点后7位。

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

使用 FLOAT可能会产生预想不到的结果,因为所有MySQL中的计算都是按照双精度计算的。见: Section A.5.7, “Solving Problems with No Matching Rows”.

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

一般大大小(双精度)的浮点数。范围是-1.7976931348623157E+308 -2.2250738585072014E-308, 0, 2.2250738585072014E-308 1.7976931348623157E+308.这些是理论上的限制。实际情况取决于你的硬件和操作系统。

M 是小数的总位数。D是小数点后的数字位数。 如果MD漏写了,那么这个限制由你的硬件决定。一个双精度的浮点数精确到小数点后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 表示bit的精确位。但是 MySQL 只是使用这个值来确定是否给结果列一个FLOATDOUBLE值。如果 p 024,数值类型成为FLOAT,没有DD值。如果p 2553,则数值类型为DOUBLE,没有MD

FLOAT(p) 语法是用来解决ODBC兼容的。

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

MySQL 5.0.3 及其以上版本:

A packed “exact” fixed-point number. M 是小数的总位数(the precision) D 是小数点之后的数字位数。小数点和负号 ‘-’ 不包括在 M.中。如果 D 0, 值没有小说点或小说部分。DECIMAL中最大的(M) 65 (64 from 5.0.3 to 5.0.5). 最大的 (D) 30.如果省略D ,默认值是 is 0. 如果省略M,默认是10 

如果指定UNSIGNED 就不允许有负值。

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

 MySQL 5.0.3之前:

An unpacked fixed-point number. Behaves like a CHAR column; “unpacked” means the number is stored as a string, using one character for each digit of the value. M is the total number of digits and D is the number of digits after the decimal point. The decimal point and (for negative numbers) the ‘-’ sign are not counted in M, although space for them is reserved. If D is 0, values have no decimal point or fractional part. The maximum range of DECIMAL values is the same as for DOUBLE, but the actual range for a given DECIMAL column may be constrained by the choice of M and D. If D is omitted, the default is 0. If M is omitted, the default is 10.

If UNSIGNED is specified, negative values are disallowed.

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

都是DECIMAL的同义词。 The FIXED synonym is available for compatibility with other servers.

11.1.2Overview of Date and Time Types

时间类型如下。详见: Section 11.3, “Date and Time Types”. 存储要求见: Section 11.5, “Column Type Storage Requirements”.

  • DATE

日期. 范围是1000-01-019999-12-31‘. MySQL 用格式‘YYYY-MM-DD‘表示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)]

A timestamp. 范围是 ‘1970-01-01 00:00:00‘ partway through the year 2037.

TIMESTAMP 列对于记录INSERTUPDATE操作的时间和日期的记录是很有用的。如果你没有指定值,那么表格中的第一个 TIMESTAMP 列制动设置为最近操作过的日期和时间。你也可以通过给它指定一个NULL值来为TIMESTAMP列设置一个当前日期和时间。 .

MySQL 5.0中, TIMESTAMP作为一个格式为‘YYYY-MM-DD HH:MM:SS‘的字符串返回。 其显示宽度为19个字符。如果你想要取得其数字值,你应该加+0timestamp列上。

  • TIME

A time. 范围是 ‘-838:59:59‘ ‘838:59:59‘. MySQL 以格式‘HH:MM:SS‘显示TIME ,但是允许你使用字符串或数字来给TIME指定值。

  • YEAR[(2|4)]

格式为2个或4个数字的年。默认是4个数字格式。在4个数字的格式中,其范围是1901215500002个数字的格式的范围是7069,表示19702069年。MySQL 以格式YYYY表示年,但是允许使用字符串或数字来指定年值。

11.1.3. Overview of String Types

字符串列的类型如下。详细信息见: Section 11.4, “String Types”. 存储要求见 in Section 11.5, “Column Type Storage Requirements”.

I有时,MySQL可以把一个string列转换为不同的类型。详见: Section 13.1.5.1, “Silent Column Specification Changes”.

MySQL 5.0 中的string数据类型有以前的4.1版本不同的性质:

许多字符串数据类型的列定义包括指定字符集的属性CHARACTER SET ,可选,校验. (CHARSET CHARACTER SET的同义词。) 这些属性也适用于 CHAR, VARCHAR, the TEXT types, ENUM, and SET. :

·                CREATE TABLE t

·                (

·                    c1 CHAR(20) CHARACTER SET utf8,

·                    c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin

·                );

这个表定义了一个字符集为utf8的名为c1的列,一个字符集为latin1且二进制校验该集合的名为c2的列。二进制校验大小写敏感。

  • MySQL 5.0 用字符单位来解释字符列定义的长度。(以前的 MySQL 版本用byte定义。)
  • 对于 CHAR, VARCHAR, TEXT 类型, BINARY 属性使得列可以指定字符集合中的二进制校验。
  • 字符列的排序和比较是基于指定的字符集合的。对于较早的版本,排序和比较是基于服务其的字符集合校验的。对于 CHAR VARCHAR , 你可以使用BINARY属性来使得列的排序和比较是使用固有的字符码的,而非词汇顺序。

更多有关MySQL 5.0字符集合的信息见: Chapter 10, Character Set Support.

  • [NATIONAL] CHAR(M) [BINARY | ASCII | UNICODE]

固定长度的字符串,存储时通常是右填充的。M 表示列的长度。MySQL 5.0中范围是0255

注意: 当读取CHAR值时,末尾的空格被移除。

Before MySQL 5.0.3, a CHAR column with a length specification greater than 255 is converted to the smallest TEXT type that can hold values of the given length. For example, CHAR(500) is converted to TEXT, and CHAR(200000) is converted to MEDIUMTEXT. This is a compatibility feature. However, this conversion causes the column to become a variable-length column, and also affects trailing-space removal.

MySQL 5.0.3 及其以后版本中,如果想指定CHAR的长度大于255,将会出错。

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 方式,且应使用默认字符集。. This is the default in MySQL.

BINARY 属性是attribute is shorthand for specifying the binary collation of the column character set. Sorting and comparison is based on numeric character values.

列类型 CHAR BYTE CHAR BINARY的别名. This is a compatibility feature.

ASCII 属性可以指定给CHAR。它指定latin1字符集。

 MySQL 5.0UNICODE属性可以指定给CHAR。 它指定了ucs2字符集。  

MySQL 允许创建一个类型为CHAR(0)的列。This is mainly useful when you have to be compliant with some old applications that depend on the existence of a column but that do not actually use the value. This is also quite nice when you need a column that can take only two values: 一个不被指定为NULL CHAR(0) 列只占有一个bit,并且只可以赋值为NULL’’.

  • CHAR

等价于CHAR(1).

  • [NATIONAL] VARCHAR(M) [BINARY]

可变长度的字符串。M 表示列的最大长度。. MySQL 5.0.3之前,M 的范围是 0 255 。之后版本中M 0 65,535 (VARCHAR的实际长度是取决于你使用的行数的最大值和字符集的。MySQL 5.0.3中最大有效长度是65,532 bytes.)

Note: Before 5.0.3, trailing spaces were removed when VARCHAR values were stored, which differs from the standard SQL specification.

Previus to MySQL 5.0.3, a VARCHAR column with a length specification greater than 255 was converted to the smallest TEXT type that could hold values of the given length. For example, VARCHAR(500) was converted to TEXT, and VARCHAR(200000) was converted to MEDIUMTEXT. This was a compatibility feature. However, this conversion affected trailing-space removal.

VARCHAR CHARACTER VARYING 的缩写。

In MySQL 5.0, the BINARY attribute is shorthand for specifying the binary collation of the column character set. Sorting and comparison is based on numeric character values.

Starting from MySQL 5.0.3, VARCHAR is stored with a one-byte or two-byte length prefix + data. The length prefix is two bytes if the VARCHAR column is declared with a length greater than 255.

  • BINARY(M)

BINARY 类似于CHAR ,单存储的是byte字符串而不是非byte字符串。

  • VARBINARY(M)

The VARBINARY 类似于 VARCHAR ,但是存储的是byte字符串,而不是非byte字符串。  

  • TINYBLOB

BLOB列的最大长度是255 (28 – 1) bytes.

  • TINYTEXT

TEXT 列的最大长度是255 (28 – 1) characters.

  • BLOB[(M)]

 BLOB 最大长度是 65,535 (216 – 1) bytes.

MySQL 5.0中可选长度 M 也可以这种类型给出。 如果这样做了,那么 MySQL将创建最小的BLOG类型来存储M byte值。

TEXT[(M)]

TEXT 最大长度 65,535 (216 – 1) characters.

In MySQL 5.0, an optional length M can be given. Then MySQL will create the column as the smallest TEXT type large enough to hold values M characters long.

  • MEDIUMBLOB

BLOB列最大长度 16,777,215 (224 – 1) bytes.

  • MEDIUMTEXT

TEXT 列最大长度16,777,215 (224 – 1) characters.

  • LONGBLOB

BLOB 列最大长度 4,294,967,295 or 4GB (232 – 1) bytes. LONGBLOG的最大有效长度取决于客户/服务器协议和可用的寄存器的最大包的大小。 effective (permitted) length of LONGBLOB columns depends on the configured maximum packet size in the client/server protocol and available memory.

  • LONGTEXT

TEXT 列的最大长度是 4,294,967,295 or 4GB (232 – 1) characters. 最大有效长度取决于客户/服务器协议和可用的寄存器的最大包的大小。effective (permitted) length of LONGTEXT columns depends on the configured maximum packet size in the client/server protocol and available memory.

  • ENUM(‘value1‘,‘value2‘,...)

枚举类型。一个字符串对象只能右一个值,且必须是value1‘, ‘value2‘, ...其中的一个。NULL 或专用的 ‘‘ 错误值。 ENUM 列可以右最多65,535 个互斥值。 ENUM 值是用内部的整数表示的。

  • SET(‘value1‘,‘value2‘,...)

集合。一个字符串对象有一个或多个值。每一必须从value1‘, ‘value2‘, ...中选择。SET 列最多有64个元素。SET 值在内部是用整数表示的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多