| MYSQL | 今天是:【农历 11月19日】 | 
|   | 
| MySQL数据库基础:数据类型及列类型 | 
|   | 
| 我们要把现实世界中的各种信息转换成计算机能理解的东西,这些转换后的信息就形成了数据。例如,某人的出生日期是“1987年5月23日”,他的身高是170厘米,等等。数据不仅包括数字、字母、文字和其他特殊字符组成的文本形式的数据,而且还包括图形、图像、动画、影像、声音等多媒体数据。但使用最多、最基本的仍然是文本数据。 
 定义一个列的语法如下: 
    其中列名由col_name 给出。列名可最多包含64个字符,字符包括字母、数字、下划线及美元符号。列名可以名字中合法的任何符号(包括数字)开头。但列名不能完全由数字组成,因为那样可能使其与数据分不开。MySQL保留诸如SELECT、DELETE和CREATE这样的词,这些词不能用做列名,但是函数名(如POS 和MIN)是可以使用的。     2. MySQL的列(字段)类型 
 
 表1:数值列类型 每种数值类型的名称和取值范围如表2所示。 
 
 
 
 | 
|  | 
表2:数值列类型的取值范围
各种类型值所需的存储量如表3所示。
| 类型说明 | 存储需求 | 
| TINYINT[(M)] | 1字节 | 
| SMALLINT[(M)] | 2字节 | 
| MEDIUMINT[(M)] | 3字节 | 
| INT[(M)] | 4字节 | 
| BIGINT[(M)] | 8字节 | 
| FLOAT[(M, D)] | 4字节 | 
| DOUBLE[(M, D)] | 8字节 | 
| DECIMAL (M, D) | M字节(MySQL < 3.23),M+2字节(MySQL > 3.23 ) | 
表3:数值列类型的存储需求
MySQL提供了五种整型: TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。INT为INTEGER的缩写。这些类型在可表示的取值范围上是不同的。整数列可定义为UNSIGNED从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大。
    MySQL 提供三种浮点类型: FLOAT、DOUBLE和DECIMAL。与整型不同,浮点类型不能是UNSIGNED的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。 
    在选择了某种数值类型时,应该考虑所要表示的值的范围,只需选择能覆盖要取值的范围的最小类型即可。选择较大类型会对空间造成浪费,使表不必要地增大,处理起来没有选择较小类型那样有效。对于整型值,如果数据取值范围较小,如人员年龄或兄弟姐妹数,则TINYINT最合适。MEDIUMINT能够表示数百万的值并且可用于更多类型的值,但存储代价较大。BIGINT在全部整型中取值范围最大,而且需要的存储空间是表示范围次大的整型INT类型的两倍,因此只在确实需要时才用。对于浮点值,DOUBLE占用FLOAT的两倍空间。除非特别需要高精度或范围极大的值,一般应使用只用一半存储代价的FLOAT型来表示数据。 
    在定义整型列时,可以指定可选的显示尺寸M。如果这样,M应该是一个1 到255的整数。它表示用来显示列中值的字符数。例如,MEDIUMINT(4)指定了一个具有4个字符显示宽度的MEDIUMINT列。如果定义了一个没有明确宽度的整数列,将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度。如果某个特定值的可打印表示需要不止M个字符,则显示完全的值;不会将值截断以适合M个字符。 
    对每种浮点类型,可指定一个最大的显示尺寸M 和小数位数D。M 的值应该取1 到255。D的值可为0 到3 0,但是不应大于M - 2(如果熟悉ODBC 术语,就会知道M 和D 对应于ODBC 概念的“精度”和“小数点位数”)。M和D对FLOAT和DOUBLE 都是可选的,但对于DECIMAL是必须的。在选项M 和D时,如果省略了它们,则使用缺省值。
    2.2字符串列类型
    MySQL提供了几种存放字符数据的串类型,其类型如下:
| 类型名 | 说明 | 
| CHAR | 定长字符串 | 
| VARCHAR | 可变长字符串 | 
| TINYBLOB | 非常小的BLOB(二进制大对象) | 
| BLOB | 小BLOB | 
| MEDIUMBLOB | 中等的BLOB | 
| LONGBLOB | 大BLOB | 
| TINYTEXT | 非常小的文本串 | 
| TEXT | 小文本串 | 
| MEDIUMTEXT | 中等文本串 | 
| LONGTEXT | 大文本串 | 
| ENUM | 枚举;列可赋予某个枚举成员 | 
| SET | 集合;列可赋予多个集合成员 | 
表4:字符串列类型
下表给出了MySQL 定义串值列的类型,以及每种类型的最大尺寸和存储需求。对于可变长的列类型,各行的值所占的存储量是不同的,这取决于实际存放在列中的值的长度。这个长度在表中用L 表示。
| 类型说明 | 最大尺寸 | 存储需求 | 
| CHAR( M) | M 字节 | M 字节 | 
| VARCHAR(M) | M 字节 | L + 1字节 | 
| TINYBLOB, TINYTEXT | 28- 1字节 | L + 1字节 | 
| BLOB, TEXT | 216- 1 字节 | L + 2字节 | 
| MEDIUMBLOB, MEDIUMTEXT | 224- 1字节 | L + 3字节 | 
| LONGBLOB, LONGTEXT | 232- 1字节 | L + 4字节 | 
| ENUM(“value1”, “value2”, ...) | 65535 个成员 | 1 或2字节 | 
| SET (“value1”, “value2”, ...) | 64个成员 | 1、2、3、4 或8字节 | 
表5:串列类型最大尺寸及存储需求
L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL 通过存储值的内容及其长度来处理可变长度的值。这些额外的字节是无符号整数。请注意,可变长类型的最大长度、此类型所需的额外字节数以及占用相同字节数的无符号整数之间的对应关系。例如,MEDIUMBLOB 值可能最多224 - 1字节长并需要3 个字节记录其结果。3 个字节的整数类型MEDIUMINT 的最大无符号值为224 - 1。这并非偶然。
   2.3日期时间列类型
    MySQL 提供了几种时间值的列类型,它们分别是: DATE、DATETIME、TIME、TIMESTAMP和YEAR。下表给出了MySQL 为定义存储日期和时间值所提供的这些类型,并给出了每种类型的合法取值范围。
| 类型名 | 说明 | 
| DATE | “YYYY-MM-DD”格式表示的日期值 | 
| TIME | “hh:mm:ss”格式表示的时间值 | 
| DATETIME | “YYYY-MM-DD hh:mm:ss”格式 | 
| TIMESTAMP | “YYYYMMDDhhmmss”格式表示的时间戳值 | 
| YEAR | “YYYY”格式的年份值 | 
表6:日期时间列类型
| 类型名 | 取值范围 | 存储需求 | 
| DATE | “1000-01-01”到“9999-12-31” | 3字节 | 
| TIME | “-838:59:59”到“838:59:59” | 3字节 | 
| DATETIME | “1000-01-01 00:00:00” 到“9999-12-31 23:59:59” | 8字节 | 
| TIMESTAMP | 19700101000000 到2037 年的某个时刻 | 4字节 | 
| YEAR | 1901 到2155 | 1字节 | 
表7: 日前时间列类型的取值范围和存储需求
下面举个例子:
| CREATE TABLE student(Name varchar(20) NOT NULL,Chinese TINYINT(3),Maths TINYINT(3),English TINYINT(3),Birthday DATE ) | 
这个例子创建一个student表,这个表中有name字段,字符类型列,不允许NULL(空值)。有Chinese、Maths和English三个整数类型列。还有个Birthday日期类型列。
 










