1. 程式人生 > >四、資料庫之資料型別

四、資料庫之資料型別

 

首先補充點了解的小知識;

select * from mysql.user  #顯示出來亂了
select * from mysql.user\G  #加了\G後一行一行顯示了

一、資料型別:分不同種類去存不同型別的資料

儲存引擎決定了表的型別,而表記憶體放的資料也要有不同的型別,每種資料型別都有自己的寬度,但寬度是可選的

1、數字(預設是有符號的)

數字又分為:

  整型:tinyint(小整型):一個位元組

     int(整型):四個位元組。注意:int的 寬度指的是顯示的寬度,與儲存無關

     bigint(大整形):八個位元組

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號: -128 ~ 127
            無符號:0~ 255

            PS: MySQL中無布林值,使用tinyint(1)構造。

 [unsigned]引數和[zerofill]引數的應用
3.將有符號的修改為無符號的:alter table t1 modify unsigned;
(注意,如果裡面有值了,
                                  得把裡面的值清空了再修改)
4.alter table t2 modify id int(10) zerofill; 如果顯示不夠,就用zerofill填充




======================================== int[(m)][unsigned][zerofill] 整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號: -2147483648 ~ 2147483647 無符號:0~
4294967295 ======================================== bigint[(m)][unsigned][zerofill] 大整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號:-9223372036854775808 ~ 9223372036854775807 無符號: 0~ 18446744073709551615

 

  小數:

     float:在位數比較短的情況下不精準(**** 數值越大,越不準確 ****)

     double:在位數比較長的情況下不精準(**** 數值越大,越不準確 ****)

     decimal:如果是小數,則推薦使用decimal

           因為精準,內部原理是以字串的形式去存

  

 1 先建立一個數據庫:create datdabase test;
 2 -----------驗證1:int,tinyint,bigint----
 3 create table t1(id tinyint);
 4 create table t1(id int);
 5 create table t1(id bigint);  #如果數字比較大的時候就用bigint
 6 1.如果沒有指定符號。預設的是有符號的
 7 2.insert into t1(-129) #就會報錯了,因為範圍是-128~127
 8 3.將有符號的修改為無符號的:alter table t1 modify unsigned;(注意,如果裡面有值了,得把裡面的值清空了再修改)
 9 4.alter table t2 modify id int(10) zerofill; 如果顯示不夠,就用zerofill填充
10 5.寬度:跟存的沒有關係,指的是顯示的寬度
11 
12 
13 ----------驗證2:float,double------
14 create table t3(salary float(5,2)) #5代表salary總共多寬,2代表小數點後保留2位,那麼整數部分有3位
15 insert into t3 values(3.725454);
16 insert into t3 values(-3.725454);
17 insert into t3 values(1111.725454);  #像這個就會報錯了
18 insert into t3 values(111.725454);
19 
20 bit型別瞭解就好了
21 bit型別:代表二進位制的型別
22 ----------驗證3:bit--------
23 create table t3(x bit);
24 insert into t3 values(0),(1);
25 insert into t3 values(0),(2)); #只能存二進位制的,這樣的話就會報錯
26 select * from t3;
驗證數字   

最後:整形型別,其實沒有必要指定顯示寬度,使用預設的就ok

2、字元、

char:簡單粗暴,不夠就用空格湊夠固定長度存放起來,浪費空間,但是儲存速度快
(犧牲空間,提高速度)
varchar(你有幾個就存幾個):精準,計算出待存放資料的長度,節省空間,存取速度慢
(犧牲速度,提高效率)

  1.-----------------

  create table t6(name char(4));
  insert into t6 values('alexsb');
  insert into t6 values('歐德博愛');
  insert into abc values('艾利克斯a');


2.-------------
create table t7(x char(5),y varchar(5)); insert into t7 values('sff','aaaaa'); select char_length(x),char_length(y) from t7; 檢視字元長度 set sql_mode='pad_char_to_full_length'; #打回原形 insert into t7 values('你好啊','好好好!');#utf-8裡面一個漢字代表三個位元組,那'你好啊'就代表九個,
                          #加上兩個空格就是11個位元組
select length(x),length(y) from t7; 檢視位元組長度

  檢視字元的長度

 

檢視位元組的長度

3、日期

作用:儲存使用者註冊時間,文章釋出時間,員工入職時間,出生時間,過期時間等

有下面幾種型別:

datatime:2017-09-06 10:30:22
data:2017-09-06
time:10:30:22
year:2017
timeatamp:和datatime是一樣的,就是支援的範圍datatime的大

---------------驗證4:日期型別-------
create table stu(
id int,
name char(5),
born_data date,
born_year year,
reg_time datetime,
class_time time
);

insert into stu values(1,'ao',now(),now(),now(),now());
insert into stu values(1,'xiao','2017-09-06','2017','2017-09-06 10:39:00','08:30:00');

#瞭解
insert into stu values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00');
insert into stu values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00'); 沒有-的可以不用加引號
insert into stu values(1,'alex','20170906',2017,'20170906103900','083000'); 也可以吧符號取了連寫



============注意啦,注意啦,注意啦===========
1. 單獨插入時間時,需要以字串的形式,按照對應的格式插入
2. 插入年份時,儘量使用4位值
3. 插入兩位年份時,<=69,以20開頭,比如50,  結果2050      
                >=70,以19開頭,比如71,結果1971
MariaDB [db1]> create table t12(y year);
MariaDB [db1]> insert into t12 values  
    -> (50),
    -> (71);
MariaDB [db1]> select * from t12;
+------+
| y    |
+------+
| 2050 |
| 1971 |
+------+
1 在實際應用的很多場景中,MySQL的這兩種日期型別都能夠滿足我們的需要,儲存精度都為秒,但在某些情況下,會展現出他們各自的優劣。下面就來總結一下兩種日期型別的區別。
2 
3 1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。
4 
5 2.DATETIME儲存時間與時區無關,TIMESTAMP儲存時間與時區有關,顯示的值也依賴於時區。在mysql伺服器,作業系統以及客戶端連線都有時區的設定。
6 
7 3.DATETIME使用8位元組的儲存空間,TIMESTAMP的儲存空間為4位元組。因此,TIMESTAMP比DATETIME的空間利用率更高。
8 
9 4.DATETIME的預設值為null;TIMESTAMP的欄位預設不為空(not null),預設值為當前時間(CURRENT_TIMESTAMP),如果不做特殊處理,並且update語句中沒有指定該列的更新值,則預設更新為當前時間。
datdatime 和 timestamp的區別

4、列舉與集合

欄位的值只能在給定範圍中選擇,如單選框,多選框

enum列舉:規定一個範圍:這個範圍可以有多個,但是為該欄位傳值時,只能取規定範圍內的其中一個
set集合:規定一個範圍:這個範圍可以有多個,但是為該欄位傳值時,可以取規定範圍內的一個或多個
enum如果你不傳值,預設是第一個值,或者為NUll

----------列舉和集合-----------
create table stu1(
id int primary key auto_increment,
name char(5),
sex enum('male','female'), #enum 代表列舉型別
hobbies set('eat','play','study','coding') #set 代表集合型別
);
insert into stu1(name,sex,hobbies) values('haiyan','none','dsfdg');
select * from stu1;  #如果設定了sex是列舉型別,就的從設定的裡面選其中的一個存
insert into stu1(name,sex,hobbies) values('haiyan','female','play,study');
select * from stu1;  #如果設定了hobbies是集合型別,就得從設定的裡面選其中一個或者多個值來存

沒有按照列舉或集合規定的傳值的結果

按照列舉或集合的規定傳值的結果

 

 

     

首先補充點了解的小知識;

select * from mysql.user  #顯示出來亂了
select * from mysql.user\G  #加了\G後一行一行顯示了

一、資料型別:分不同種類去存不同型別的資料

儲存引擎決定了表的型別,而表記憶體放的資料也要有不同的型別,每種資料型別都有自己的寬度,但寬度是可選的

1、數字(預設是有符號的)

數字又分為:

  整型:tinyint(小整型):一個位元組

     int(整型):四個位元組。注意:int的 寬度指的是顯示的寬度,與儲存無關

     bigint(大整形):八個位元組

========================================
        tinyint[(m)] [unsigned] [zerofill]

            小整數,資料型別用於儲存一些範圍的整數數值範圍:
            有符號: -128 ~ 127
            無符號:0~ 255

            PS: MySQL中無布林值,使用tinyint(1)構造。

 [unsigned]引數和[zerofill]引數的應用
3.將有符號的修改為無符號的:alter table t1 modify unsigned;(注意,如果裡面有值了,
                                  得把裡面的值清空了再修改)
4.alter table t2 modify id int(10) zerofill; 如果顯示不夠,就用zerofill填充




======================================== int[(m)][unsigned][zerofill] 整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號: -2147483648 ~ 2147483647 無符號:0~ 4294967295 ======================================== bigint[(m)][unsigned][zerofill] 大整數,資料型別用於儲存一些範圍的整數數值範圍: 有符號:-9223372036854775808 ~ 9223372036854775807 無符號: 0~ 18446744073709551615

 

  小數:

     float:在位數比較短的情況下不精準(**** 數值越大,越不準確 ****)

     double:在位數比較長的情況下不精準(**** 數值越大,越不準確 ****)

     decimal:如果是小數,則推薦使用decimal

           因為精準,內部原理是以字串的形式去存

  

 1 先建立一個數據庫:create datdabase test;
 2 -----------驗證1:int,tinyint,bigint----
 3 create table t1(id tinyint);
 4 create table t1(id int);
 5 create table t1(id bigint);  #如果數字比較大的時候就用bigint
 6 1.如果沒有指定符號。預設的是有符號的
 7 2.insert into t1(-129) #就會報錯了,因為範圍是-128~127
 8 3.將有符號的修改為無符號的:alter table t1 modify unsigned;(注意,如果裡面有值了,得把裡面的值清空了再修改)
 9 4.alter table t2 modify id int(10) zerofill; 如果顯示不夠,就用zerofill填充
10 5.寬度:跟存的沒有關係,指的是顯示的寬度
11 
12 
13 ----------驗證2:float,double------
14 create table t3(salary float(5,2)) #5代表salary總共多寬,2代表小數點後保留2位,那麼整數部分有3位
15 insert into t3 values(3.725454);
16 insert into t3 values(-3.725454);
17 insert into t3 values(1111.725454);  #像這個就會報錯了
18 insert into t3 values(111.725454);
19 
20 bit型別瞭解就好了
21 bit型別:代表二進位制的型別
22 ----------驗證3:bit--------
23 create table t3(x bit);
24 insert into t3 values(0),(1);
25 insert into t3 values(0),(2)); #只能存二進位制的,這樣的話就會報錯
26 select * from t3;
驗證數字   

最後:整形型別,其實沒有必要指定顯示寬度,使用預設的就ok

2、字元、

char:簡單粗暴,不夠就用空格湊夠固定長度存放起來,浪費空間,但是儲存速度快
(犧牲空間,提高速度)
varchar(你有幾個就存幾個):精準,計算出待存放資料的長度,節省空間,存取速度慢
(犧牲速度,提高效率)

  1.-----------------

  create table t6(name char(4));
  insert into t6 values('alexsb');
  insert into t6 values('歐德博愛');
  insert into abc values('艾利克斯a');


2.-------------
create table t7(x char(5),y varchar(5)); insert into t7 values('sff','aaaaa'); select char_length(x),char_length(y) from t7; 檢視字元長度 set sql_mode='pad_char_to_full_length'; #打回原形 insert into t7 values('你好啊','好好好!');#utf-8裡面一個漢字代表三個位元組,那'你好啊'就代表九個,
                          #加上兩個空格就是11個位元組
select length(x),length(y) from t7; 檢視位元組長度

  檢視字元的長度

 

檢視位元組的長度

3、日期

作用:儲存使用者註冊時間,文章釋出時間,員工入職時間,出生時間,過期時間等

有下面幾種型別:

datatime:2017-09-06 10:30:22
data:2017-09-06
time:10:30:22
year:2017
timeatamp:和datatime是一樣的,就是支援的範圍datatime的大

---------------驗證4:日期型別-------
create table stu(
id int,
name char(5),
born_data date,
born_year year,
reg_time datetime,
class_time time
);

insert into stu values(1,'ao',now(),now(),now(),now());
insert into stu values(1,'xiao','2017-09-06','2017','2017-09-06 10:39:00','08:30:00');

#瞭解
insert into stu values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00');
insert into stu values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00'); 沒有-的可以不用加引號
insert into stu values(1,'alex','20170906',2017,'20170906103900','083000'); 也可以吧符號取了連寫



============注意啦,注意啦,注意啦===========
1. 單獨插入時間時,需要以字串的形式,按照對應的格式插入
2. 插入年份時,儘量使用4位值
3. 插入兩位年份時,<=69,以20開頭,比如50,  結果2050      
                >=70,以19開頭,比如71,結果1971
MariaDB [db1]> create table t12(y year);
MariaDB [db1]> insert into t12 values  
    -> (50),
    -> (71);
MariaDB [db1]> select * from t12;
+------+
| y    |
+------+
| 2050 |
| 1971 |
+------+
1 在實際應用的很多場景中,MySQL的這兩種日期型別都能夠滿足我們的需要,儲存精度都為秒,但在某些情況下,會展現出他們各自的優劣。下面就來總結一下兩種日期型別的區別。
2 
3 1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。
4 
5 2.DATETIME儲存時間與時區無關,TIMESTAMP儲存時間與時區有關,顯示的值也依賴於時區。在mysql伺服器,作業系統以及客戶端連線都有時區的設定。
6 
7 3.DATETIME使用8位元組的儲存空間,TIMESTAMP的儲存空間為4位元組。因此,TIMESTAMP比DATETIME的空間利用率更高。
8 
9 4.DATETIME的預設值為null;TIMESTAMP的欄位預設不為空(not null),預設值為當前時間(CURRENT_TIMESTAMP),如果不做特殊處理,並且update語句中沒有指定該列的更新值,則預設更新為當前時間。
datdatime 和 timestamp的區別

4、列舉與集合

欄位的值只能在給定範圍中選擇,如單選框,多選框

enum列舉:規定一個範圍:這個範圍可以有多個,但是為該欄位傳值時,只能取規定範圍內的其中一個
set集合:規定一個範圍:這個範圍可以有多個,但是為該欄位傳值時,可以取規定範圍內的一個或多個
enum如果你不傳值,預設是第一個值,或者為NUll

----------列舉和集合-----------
create table stu1(
id int primary key auto_increment,
name char(5),
sex enum('male','female'), #enum 代表列舉型別
hobbies set('eat','play','study','coding') #set 代表集合型別
);
insert into stu1(name,sex,hobbies) values('haiyan','none','dsfdg');
select * from stu1;  #如果設定了sex是列舉型別,就的從設定的裡面選其中的一個存
insert into stu1(name,sex,hobbies) values('haiyan','female','play,study');
select * from stu1;  #如果設定了hobbies是集合型別,就得從設定的裡面選其中一個或者多個值來存

沒有按照列舉或集合規定的傳值的結果

按照列舉或集合的規定傳值的結果