Mysql学习笔记(二)数据类型 补充

时间:2022-03-03 12:12:33

原文:Mysql学习笔记(二)数据类型 补充

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)

以上算是对数据类型的进一步补充...欢迎大家来指点...