这两天都在找mysql的资料。觉得这个挺有用的。就找来了。


varchar设定长度后,如果超出设定值则被截断 (2008-12-2)

    varchar最大 21843

    char最大 255

datetime (2008-11-6 时间字段的区别 andy注)

    不能自动生成当前时间, MySQL的默认值不允许设为函数, SQL server用now, Oracle用sysdate

    格式 'YYYY-MM-DD HH:MM:SS'

    范围 '1000-01-01 00:00:00' - '9999-12-31 23:59:59'

date

    格式 'YYYY-MM-DD' 没有时间部分,只有日期

    范围 '1000-01-01' - '9999-12-31'

timestamp

    可以自动添加默认值为系统当前时间

    在一个表里只能设一个timestamp列,

    范围 1970-2037

一个字节=8个2进制位

一个中文2个字节

一个英文为1个字节

2 ^ 4     = 16

2 ^ 7     = 128

2^ 8      = 256

2^ 15     = 32768

2^ 16     = 65536

2^ 23     = 8388608

2^ 24     = 16777216

2^ 31     = 2147483648

2^ 32     = 4294967296

2^ 63     = 9223372036854775808

2^ 64     = 18446744073709551616

亿:代表的是10的八次方。

兆:代表的是10的十二次方。

京:代表的是10的十六次方。

垓:代表的是10的二十次方。

属性attributes:

        unsigned:无符号

unsigned zerofill:无符号左边补0  这里对我最有用。我特别指出。

        on update current_timestamp:插入当前时间

宽度指示器

        MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展,这样当从数据库检索一个值时,可以把这个值加长到指定的长度。

        例如,指定一个字段的类型为 INT(6),就可以保证所包含数字少于 6 个的值从数据库中检索出来时能够自动地用空格填充。

        需要注意的是,

        使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。

        万一我们需要对一个字段存储一个超出许可范围的数字,MySQL 会根据允许范围最接近它的一端截短后再进行存储。

        还有一个比较特别的地方是,MySQL 会在不合规定的值插入表前自动修改为 0。

UNSIGNED

        修饰符规定字段只保存正值。因为不需要保存数字的正、负符号,可以在储时节约一个“位”的空间。

        从而增大这个字段可以存储的值的范围。

ZEROFILL

        修饰符规定 0(不是空格)可以用来真补输出的值。使用这个修饰符可以阻止 MySQL 数据库存储负值。

在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,

而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

设置tinyint,smallint,mediumint,int时后面位数不用指定,自动填上

·tinyint[(m)] [unsigned] [zerofill]--4位, 1字节, 2^ 8,100-200

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

·bool,boolean

        是tinyint(1)的同义词。zero值被视为假。非zero值视为真。

        在将来,将根据标准sql引入完全布尔类型的处理。

·smallint[(m)] [unsigned] [zerofill]--5位, 2字节, 2^ 16,3-6万

        小的整数。带符号的范围是-32768到32767。无符号的范围是0到65535。

·mediumint[(m)] [unsigned] [zerofill]--9位, 3字节, 2^ 24,800-1000万

        中等大小的整数。带符号的范围是-8388608到8388607。无符号的范围是0到16777215。

·int[(m)] [unsigned] [zerofill]--11位, 4字节, 2^ 32,20-40亿

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

·integer[(m)] [unsigned] [zerofill]

        这是int的同义词。

·bigint[(m)] [unsigned] [zerofill]--20位, 8字节, 2^ 64,900-1000京

        大整数。带符号的范围是-9223372036854775808到9223372036854775807。无符号的范围是0到18446744073709551615

·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中的所有计算用双精度完成。

·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同义词适用于与其它服务器的兼容性。

·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。

·[NATIONAL] CHAR(M) [BINARY| ASCII | UNICODE]--255字符

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

·[NATIONAL] VARCHAR(M) [BINARY]--65,535 6万

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

·BINARY(M)

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

·VARBINARY(M)

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

        4.1以下的版本, 最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。

        MySQL5.0以上的版本,varchar数据类型的长度支持到了65535,可以存放65532个字节的数据,起始位和结束位占去了3个字节

        在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,能有效的减少数据库文件的大小

        65532/3 = 21844 (utf-8编码存储 一个字为3个字节)

        最大可设为 varchar(21843)

·TINYBLOB--255

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

·TINYTEXT--255

        最大长度为255(28–1)字符的TEXT列。

·BLOB[(M)]--65,535 6万

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

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

·TEXT[(M)]--65,535 6万

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

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

·MEDIUMBLOB--16,777,215 1亿

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

·MEDIUMTEXT--16,777,215 1亿

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

·LONGBLOB--4,294,967,295 40亿

        最大长度为4,294,967,295或4GB(232–1)字节的BLOB列。

        LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。

·LONGTEXT--4,294,967,295 40亿

        最大长度为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值在内部用整数表示。

列类型      需要的存储量

TINYINT    1 字节

SMALLINT   2 个字节

MEDIUMINT   3 个字节

INT        4 个字节

INTEGER    4 个字节

BIGINT     8 个字节

FLOAT(X)   4 如果 X < = 24 或 8 如果 25 < = X < = 53

FLOAT      4 个字节

DOUBLE     8 个字节

DOUBLE PRECISION   8 个字节

REAL       8 个字节

DECIMAL(M,D) M字节(D+2 , 如果M < D)

NUMERIC(M,D) M字节(D+2 , 如果M < D)

日期和时间类型

列类型      需要的存储量

DATE       3 个字节

DATETIME   8 个字节

TIMESTAMP 4 个字节

TIME       3 个字节

YEAR       1 字节

串类型

列类型      需要的存储量

CHAR(M)            M字节,1 &lt;= M &lt;= 255

VARCHAR(M)         L+1 字节, 在此L &lt;= M和1 &lt;= M &lt;= 255

TINYBLOB, TINYTEXT L+1 字节, 在此L&lt; 2 ^ 8

BLOB, TEXT         L+2 字节, 在此L&lt; 2 ^ 16

MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L&lt; 2 ^ 24

LONGBLOB, LONGTEXT      L+4 字节, 在此L&lt; 2 ^ 32

ENUM('value1','value2',...) 1 或 2 个字节, 取决于枚举值的数目(最大值65535)

SET('value1','value2',...) 1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)