數值型
整型:
tinyint:微小的列類型,1個字節,默認有符號,存儲范圍:-128--127
可選屬性:tingyint(M) unsigned zerofill
M:寬度(在0填充(zerofill)時才有效),只是顯示效果,不影響實際數據的存儲范圍;unsigned:無符號類型
注意:如果某列是zerofill,那么則是unsigned。
smallint:2個字節
mediumint:3個字節
int:4個字節
bigint:8個字節
舉例:
創建一個表:
1 create tableclass(2 id int primary key auto_increment,--id 自增長
3 name varchar(20),4 age tinyint
5 );
插入數據:
1 insert into class(name,age) values ('張三',25),('李四',26),('王五',27);
然后更改列的定義實驗zerofill:可以看到age1前面填充了4個0
alter table class add age1 tinyint(5) zerofill;insert into table class(age1) values (3);--插入一條數據--查詢結果:
select * fromclass;--結果顯示如下:
id | name | age |age1----+------+------+-------
1 | 張三 | 25 | NULL
2 | 李四 | 26 | NULL
3 | 王五 | 27 | NULL
4 | NULL | NULL | 00003
設置列的默認值,一般這樣結合設置:可以省去not null,但是一般推薦這樣使用。
1 not null default '默認的值'
2 --添加一列設置默認值
3 alter table class add age2 tinyint not null default 10;4 --查詢結果
5 select * fromclass;6 +----+------+------+-------+------+
7 | id | name | age | age1 | age2 |
8 +----+------+------+-------+------+
9 | 1 | 張三 | 25 | NULL | 10 |
10 | 2 | 李四 | 26 | NULL | 10 |
11 | 3 | 王五 | 27 | NULL | 10 |
12 | 4 | NULL | NULL | 00003 | 10 |
13 +----+------+------+-------+------+
小數型:浮點型,定點型
float(M,D) M:精度(總位數,不包含小數點),D:標度(小數點后面的位數) 比如:float(6,2)表示的范圍是:-9999.99-->9999.99
1 --創建一個表
2 create tablegoods(3 name varchar(20) not null default ' ',4 price float(6,2) not null default 0.00
5);6 --增加一列
7 alter table goods add price1 float(6,3) not null default 100.000
8 --插入數據
9 insert into goods (name,price) values ('跑步機',99,300),('飲水機',199,700);10 --查詢數據:
11 select * fromgoods;12 +--------+--------+---------+
13 | name | price | price1 |
14 +--------+--------+---------+
15 | 跑步機 | 99.00 | 300.000 |
16 | 飲水機 | 199.00 | 700.000 |
17 +--------+--------+---------+
再插入一條數據:
insert into goods (name,price,price1) values ('跑步機1',99.685,300),('飲水機1',99.675,700)--查詢出來的數據:
select * fromgoods;+---------+--------+---------+
| name | price | price1 |
+---------+--------+---------+
| 跑步機 | 99.00 | 300.000 |
| 飲水機 | 199.00 | 700.000 |
| 跑步機1 | 99.69 | 300.000 |
| 飲水機1 | 99.67 | 700.000 |
+---------+--------+---------+
注意:這里的price按照四舍五入應該是99.69和99.68的,但是查詢出來的數據卻是99.69和99.67;這是因為Mysql采取的不是數學上的四舍五入,而是采用銀行的四舍五入:即1,2,3,4舍,6,7,8,9入;而5就是根據5前面的一位數來確定是舍還是入:1,3,5,7就舍掉,0,2,4,6就加上.
定點型 decimal 比float精度要高些。
alter table goods add bigprice float(9,2) not null default 0.00
alter table goods add decimalprice decimal(9,2) not null default 0.00插入數據:insert into goods (name,bigprice,decimalprice) values ('自行車',123456.23,123456.23)
查詢數據;select * fromgoods;+---------+--------+---------+-----------+--------------+
| name | price | price1 | bigprice | decimalprice |
+---------+--------+---------+-----------+--------------+
| 跑步機 | 99.00 | 300.000 | 0.00 | 0.00 |
| 飲水機 | 199.00 | 700.000 | 0.00 | 0.00 |
| 跑步機1 | 99.69 | 300.000 | 0.00 | 0.00 |
| 飲水機1 | 99.67 | 700.000 | 0.00 | 0.00 |
| 自行車 | 0.00 | 100.000 | 123456.23 | 123456.23 |
+---------+--------+---------+-----------+--------------+--這里沒有明顯的區別,修改一下數據:
update goods set bigprice=1234567.23 and decimalprice=1234567.23 where name='自行車'
select * fromgoods;+---------+--------+---------+------------+--------------+
| name | price | price1 | bigprice | decimalprice |
+---------+--------+---------+------------+--------------+
| 跑步機 | 99.00 | 300.000 | 0.00 | 0.00 |
| 飲水機 | 199.00 | 700.000 | 0.00 | 0.00 |
| 跑步機1 | 99.69 | 300.000 | 0.00 | 0.00 |
| 飲水機1 | 99.67 | 700.000 | 0.00 | 0.00 |
| 自行車 | 0.00 | 100.000 | 1234567.25 | 123456.23 |
+---------+--------+---------+------------+--------------+
這里小數位最后一個是25,一個是23了,所以decimal比float精確,因此銀行業務一般是采取的decimal類型。
字符型
char(M):M個字符,如果小于M個字符,實占M個字符,利用率:<=100%,不夠M個字符的,最后用空格補起。
varchar(M):M個字符,存儲的數據小于M個字符,設為N,N<=M,利用率小于100%,因為有一兩個字節要用來記錄占用的空間。
create tablestu(
namechar(8) not null default '',
waihaovarchar(10) not null default '')insert into stu values ('一二三四五六七','一二三四五六七')insert into stu values ('一二三','一二三')select * fromstu;+------------------+--------------------+
| name | waihao |
+------------------+--------------------+
| 張三 | 三兒 |
| 啊啊是個大傻逼啊 | 大傻逼啊打打的的的 |
| 一二三四五六七 | 一二三四五六七 |
| 一二三 | 一二三 |
+------------------+--------------------+--在字符串后面加連接符來看是否丟失空格:
select concat(name,'!'),CONCAT(waihao,'!') fromstu;+-------------------+---------------------+
| concat(name,'!') | CONCAT(waihao,'!') |
+-------------------+---------------------+
| 張三! | 三兒! |
| 啊啊是個大傻逼啊! | 大傻逼啊打打的的的! |
| 一二三四五六七! | 一二三四五六七! |
| 一二三! | 一二三 ! |
+-------------------+---------------------+
通過select查詢到的結果發現,char型的丟了空格,varchar由于有1-2字節記錄占用的情況,不會丟失空格。
速度上char快,varchar稍慢,要去字節里面取存儲了多少值。
因此char和varchar的區別:
char是的范圍0-255,varchar 0-65535左右,char是創建就全部分配空間,varchar是用多少分配多少,同時char由于最后不足的數據會用空格代替,因此如果存儲的數據末尾有空格,取值出來會把空格丟掉,會照成空格丟失,而varchar不會。同時char速度較快,varchar速度稍慢。
選取原則:
1.空間利用效率 四字成語表,char(4);微博140字,varchar(140)
2.速度 用戶名:char,
text 文本串,可以存較大的文本段,搜索速度比較慢,如果不是特別大,推薦用varchar,text不能設置默認值。