PS:简单的补充一下数据类型里的String类型以及列类型...
学习内容:
1.String类型
2.列类型存储需求
String类型:
i.char与varchar
char与varchar的类型相似,但是他们的保存方式和检索方式不同...
char的存储结构是固定长度的存储...即指定了几个字节,那么就占用几个字节,如char(4),那么无论存入的是什么字串,那么都占用四个字节...char的
可表示长度范围为0-255的任何值,当保存的字节不够指定的范围时,会使用空格来补齐...当检索的时候,会剪除掉补齐的空格...
varchar的存储结构是可变的存储,即我们指定了varchar(4),但是我们存储的是“ab”那么在varchar的存储中只占用了三个字节..varchar占用的字
节,是我们保存的字节length+1的长度...可表示的长度范围是0-65535之间的任何值...当我们保存的字串长度超过了我们定义的范围的时候,按照不严格的格式,多余的部分会被直接舍去...若是严格格式会出现错误...还有在char和varchar进行字符比较的时候,都会舍去其中的空格进行比较...
值 | CHAR(4) | 存储需求 | VARCHAR(4) | 存储需求 |
" | ' ' | 四个字节 | '' | 一个字节 |
'ab' | 'ab ' | 四个字节 | 'ab ' | 三个字节 |
'abcd' | 'abcd' | 四个字节 | 'abcd' | 五个字节 |
'abcdefg' | 'abcd' | 四个字节 | 'abcd' | 五个字节 |
mysql> CREATE TABLE names (myname CHAR(10), yourname VARCHAR(10));
Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO names VALUES ('Monty ', 'Monty ');
Query OK, 1 row affected (0.00 sec) mysql> SELECT myname = 'Monty ', yourname = 'Monty ' FROM names;
+--------------------+----------------------+
| myname = 'Monty ' | yourname = 'Monty ' |
+--------------------+----------------------+
| 1 | 1 |
+--------------------+----------------------+这是比较的结果...并且在所有mysql中均是如此,不会受到服务器模式的影响...
ii.binary 与 varbinary
BINARY和VARBINARY类类似于CHAR和VARCHAR,不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值值。
iii.BLOB和TEXT类型
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
iv.ENUM..枚举类型
枚举类型一般在公司中会用得到,在这里也简单的介绍一下..
枚举其实就是在我们创建表结构的时候,定义的一种数据类型,在我们在执行插入操作的时候,只允许插入指定的枚举类型的范围中,如果插入的数据超过了枚举类型的范围,在严格的情况下就会出错...不严格的情况下会发出警告。。
create table enum
(
f1 enum('','','','','','') 枚举定义的范围
);//
-------------------------------------------------------
insert into enum values(1);
insert into enum values(2);
insert into enum values(3); insert into enum values(8)//严格情况下会出现下列错误... ERROR 1265 (01000): Data truncated for column 'f1' at row 1 不严格的情况下会发出警告,并且会将空值插入表格当中... 改表 alter table enum f1 modify f1 enum('a','b','c','d','e','f'); select * from enum;
这里只是简单的介绍了一下枚举类型,想具体研究的,可以去查看帮助文档...
v.SET(集合类型)
SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包括多个SET成员的SET列值时各成员之间用逗号(‘,’)间隔开。这样SET成员值本身不能包含逗号。set的容纳范围为64个不同的成员..set其实和枚举差不多,set指定了一个集合范围,在我们插入数据的时候,需要插入在set范围之内的元素,如果插入了未被包含的元素,那么就会发出警告..
CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));//新建表格 INSERT INTO myset (col) VALUES ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d'); select col from myset;//索引值全部显示'a,d'; insert into myset (col) values('a,b,s');//会发出警告,并且s不会被插入到表格当中 select col from myset;
也可以使用find_in_set()或like修饰符来搜索set值...
mysql> SELECT * FROM tbl_name WHERE FIND_IN_SET('value',set_col)>0; mysql> SELECT * FROM tbl_name WHERE set_col LIKE '%value%'; //第1个语句找出SET_col包含value set成员的行。第2个类似,但有所不同:它在其它地方找出set_col包含value的行,甚至是在另一个SET成员的子字符串中。 //下面的语句也是合法的: mysql> SELECT * FROM tbl_name WHERE set_col & 1; mysql> SELECT * FROM tbl_name WHERE set_col = 'val1,val2'; //第1个语句寻找包含第1个set成员的值。第2个语句寻找一个确切匹配的值。应注意第2类的比较。将set值与'val1,val2'比较返回的结果与同'val2,val1'比较返回的结果不同。指定值时的顺序应与在列定义中所列的顺序相同。
其实在现在的公司中,现在set,enum,boolean都被tinyint微整形所代替,在这方面有所了解即可...
列类型存储需求:
列类型的存储需求实际的意义就是,当我们在存储数据的时候,要用合适的类型来存储我们的数据类型...比如说当我们的存储的数据的范围为1-99999,若使用整数,那么最好的选择就是mediumint unsigned,用int也可以,但是为了优化存储,我们使用了mediumint unsigned,总而言之,在存储数据的时候一定要选择合适的存储类型...
使用来自其他数据库引擎的列类型
为了使用由其它卖方编写的SQL执行代码,MySQL按照下表所示对列类型进行映射。通过这些映射,可以很容易地从其它数据库引擎将表定义导入到MySQL中:
其他卖方类型 | mysql类型 |
BOOL | TINYINT |
BOOLEAN | TINYINT |
CHAR VARCHAR(M) | VARCHAR(M) |
DEC | DECIMAL |
FIXED | DECIMAL |
FLOAT4 | FLOAT |
FLOAT8 | DOUBLE |
INT1 | TINYINT |
INT2 | SMALLINT |
INT3 | MEDIUMINT |
INT4 | INT |
INT8 | BIGINT |
LONG VARBINARY | MEDIUMBLOB |
LONG VARCHAR | MEDIUMTEXT |
LONG | MEDIUMTEXT |
MIDDLEINT | MEDIUMINT |
NUMERIC | DECIMAL |
在创建表时对列类型进行映射,然后原来的类型定义被丢弃。如果你使用其它卖方的类型创建一个表,然后执行DESCRIBE tbl_name语句,MySQL使用等效的MySQL类型来报告表的结构。例如:
mysql> CREATE TABLE t (a BOOL, b FLOAT8, c LONG, d NUMERIC);
Query OK, 0 rows affected (0.08 sec) mysql> DESCRIBE t;
+-------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------+------+-----+---------+-------+
| a | tinyint(1) | YES | | NULL | |
| b | double | YES | | NULL | |
| c | mediumtext | YES | | NULL | |
| d | decimal(10,0) | YES | | NULL | |
+-------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)
以上算是对数据类型的进一步补充...欢迎大家来指点...