MySql - 數據類型

1:數據類型分類
MySql的數據類型大體能夠分爲三類:數據庫

  • 數值型
  • 字符型
  • 時間和日期

2:各個數據類型的存儲大小和取值範圍spa

數字型:操作系統

Screen Shot 2020-01-06 at 11.20.02 AM.png

定點數

定點數就是小數點前面的數字個數和小數點後面的數字個數都肯定的數字。
語法爲3d

DECIMAL(M, N)

M: 全部的數字總個數
N: 小數點後面的數字個數code

DECIMAL(5, 2) 可表示的範圍爲 `-999.99`to`999.99`

對於定點數,數據庫存的是確切值,而不是近似值,這點與浮點數不一樣。blog

確切值,就是指數據庫存的時候不會作四捨五入。你給的是什麼值,在數據庫裏面存的就是什麼值。排序

可是,當給的數超過了設置的位數,存入數據庫怎麼處理,依賴於具體的操做系統,可是通常來講會直接截掉超出位數的部分。事務

浮點數:

語法:ci

FLOAT(M, N), DOUBLE(M, N)

M: 總的數字個數
N: 小數點後面的數字個數
例如:字符串

FLOAT(7, 4)能夠表示`-999.9999`
浮點數的問題:

對於定義了FLOAT(7, 4)的數值,若是數字是999.00009,由於超過了定義的位數,當存入數據庫的時候,MySql會進行四捨五入,因此最後在數據庫裏獲得的數字是999.0001。

因此,若是你對數據庫裏面的浮點數作比較,經常可能會出問題,由於數據庫在存浮點數的時候存的是一個近似值,而不是確切值


字符型:

Screen Shot 2020-01-06 at 11.22.04 AM.png

CHAR vs VARCHAR

char:char是定長,若是存入的數據不夠定義的那麼長會用空格補全。可是讀取數據的時候,會自動把空格去掉。

varchar: varchar是變長,在數據庫裏所佔的位數根據存入的數據字符長度而變化。在讀取數據的時候,也不會自動把空格去掉。

下圖很直觀地展現了char和varchar在存儲的時候的區別:
Screen Shot 2020-01-06 at 3.12.12 PM.png

定義字符型列
CREATE  TABLE t ( c1 VARCHAR(20)  CHARACTER  SET utf8, 
c2 TEXT  CHARACTER  SET latin1 COLLATE latin1\_general\_cs );

定義字符型的時候,通常根據你的需求定義字符集。經過"CHARSET SET"或者"charset".

枚舉類型

CREATE  TABLE shirts (  name  VARCHAR(40), 
size ENUM('x-small',  'small',  'medium',  'large',  'x-large')  );

能夠經過"enum_col"來獲取枚舉數據的index。可是,注意,枚舉的index不是數據庫表的index,兩者之間沒有關係。

Screen Shot 2020-01-06 at 4.07.25 PM.png

上圖展現了枚舉類型的index。空字符串的index都是0,NULL的index爲NULL。

枚舉的排序
默認狀況下,枚舉的排序是按照枚舉的index。不少時候默認排序沒法知足你的需求,爲了不這種狀況:
1:可使用ORDER BY CAST或者ORDER BY CONCAT。
2:或者按照字母順序存入枚舉數據。

數字型的枚舉
使用數字(1)或者數字字面量("1")做爲枚舉,都是不推薦的作法。緣由咱們經過如下的一個例子來講明。

Screen Shot 2020-01-06 at 6.23.12 PM.png
1: 假設咱們定義了一個數字字面量的枚舉類型的列:numbers

numbers ENUM('0','1','2')

2: 咱們依次存入:2, '2', 3
3: 那最後咱們在數據庫裏獲得的數據是:'1', '2', '2'

咱們之因此獲得'1', '2', '2'的緣由是:

1:當咱們存入2的時候,2被解釋成枚舉的index. 當index=2的時候,對應的枚舉值是'1',因此存入數據庫裏面第一個值是'1'。
2:當咱們存入'2'的時候,'2'是ENUM('0','1','2')裏的一個合法值,因此被正確地存入數據庫,獲得'2'。
3:當咱們存入'3'的時候,'3'不在枚舉的範圍內,因此被當成了index。當index=3時,對應的枚舉值是'2'。

經過以上這個例子,咱們能夠看到若是把數字字面量做爲枚舉,將會產生意想不到的bug。因此,最好不要使用數字字面量做爲枚舉。

Set類型
語法:

SET('one', 'two')

讀取Set數據:

SELECT  set_col+0  FROM  tbl_name;

時間和日期:

Screen Shot 2020-01-06 at 11.22.16 AM.png

1:時間和日期有哪三種類型?

DATE, DATETIME, TIMESTAMP

DATE: 使用"yyyy-mm-dd"的格式表示。DATE只能表示日期,不能有具體的時間(點鐘)。取值範圍爲'1000-01-01' ~ '9999.12.31'。

DATETIME: 使用"yyyy-mm-dd hh:mm:ss"格式表示。DATETIME表示既有日期又又具體點鐘的時間。可取值範圍爲
'1000-01-01 00:00:00' ~ '9999.12.31 23:59:59'。

TIMESTAMP: TIMESTAMP可用來表示帶有時區的時間。它的可取值範圍爲'1970-01-01 00:00:01'UTC ~ '2038-01-19 03:14:07'UTC。

2:時間和日期有哪些注意的點?

DATE,DATETIME都是不帶時區的,TIMESTAMP是帶時區的。當存TIMESTAMP數據的時候,MySql把當前的時區轉換爲UTC;讀取TIMESTAMP數據的時候,又從UTC時區轉化爲當前的時區。

3:mySql對於不合法的日期和時間是怎麼處理的?

對於不合法的日期,例如'2000-45-50',或者'2004-04-31',MySql會把他們轉化爲'0000-00-00'(非嚴格模式),或者直接獲得error(嚴格模式)

4:mySql對2位數的年怎麼處理?

  • 00 - 69會被轉化爲 2000 - 2069
  • 70 - 99會被轉化爲 1970 - 1999

insert或者update時數據的默認值
1:能夠在定義列的時候明確地給出默認值:

create table t1(age   INT  DEFAULT  0);

2: 若是沒有在定義的時候給出明確的默認值:

若是在insert或者update的時候給不能是null的列,沒有提供明確的值,那麼MySql會按照下面的邏輯處理:

  • 嚴格模式下,

    • 若是是事務表(transaction,會報錯,不但本條操做不成功,全部操做會回滾(roll back)。
    • 若是不是事務表,會報錯;本條操做不會成功。可是,若是這條insert或者update前面還有別的操做,那麼前面的操做會成功。
  • 非嚴格模式下,

    • 本條操做會成功,MySql會設置這列爲此數據類型相應的默認值。

那麼,不一樣的數據類型的默認值是什麼呢?
不一樣數據類型的默認值

數值類型:默認值爲0。若是設置了AUTO_INCREMENT,則是自動增加的值。
DATE,DATETIME:默認值是對應的'0'值。
TIMESTAMP:

若是開啓了explicit_defaults_for_timestamp, 默認值也是對應的'0'值。

若是沒有開啓explictit_defaults_for_timestamp, 默認值就是此刻的時間值。

除了ENUM以外的字符串類型: 默認值是空字符串
ENUM類型:默認值是ENUM的第一個元素值。

相關文章
相關標籤/搜索