MySQL技術內幕 SQL程式設計讀書筆記

2021-10-16 12:27:46 字數 4030 閱讀 3425

# 第2章  資料型別

1. 資料型別在資料庫中扮演著基礎又非常重要的角色。對資料型別的選擇將影響與資料庫互動的應用程式的效能。

## 2.1 型別屬性

1. 在介紹資料型別前,先來介紹兩個屬性:unsigned和zerofill,是否使用這兩個屬性對選擇資料型別有著莫大的關係。

### 2.1.1 unsigned

1. unsigned屬性就是將數字型別無符號化,與c、c++這些程式語言中的unsigned含義相同。

### 2.1.2 zerofill

1. zerofill屬性非常有意思,更像是乙個顯示的屬性。zerofill屬性的作用就是如果寬度小於設定的寬度,則自動填充0。要注意的是,這只是對顯示結果進行處理,對儲存的值無影響。

## 2.2 sql_mode設定

1. sql_mode可能是比較容易讓開發人員和dba忽略的乙個變數,預設為空。sql_mode的設定其實是比較冒險的一種設定,因為在這種設定下可以允許一些非法操作。因此在生產環境中強烈建議開發人員將這個值設為嚴格模式。正確地設定sql_mode還可以做一些約束(constraint)檢查的工作。

2. 對於sql_mode的設定,可以在mysql的配置檔案如my.cnf和my.ini中進行,也可以在客戶端工具中進行,並且可以分別進行全域性的設定或者當前會話的設定。下面的命令可以用來檢視當前sql_mode的設定情況。

1. select @@global.sql_mode\g (全域性)

2. select @@session.sql_mode\g(當前會話)

3. 嚴格模式是指將sql_mode變數設定為strict_trans_tables或strict_all_tables中的至少一種。現在來看下sql_mode可以設定的選項。

1. strict_trans_tables:在該模式下,如果乙個值不能插入到乙個事務表中,則中斷當前的操作不影響非事務表。

2. allow_invalid_dates:該選項並不完全對日期的合法性進行檢查,只檢查月份是否在1~12之間,日期是否在1~31之間。該模式僅對date和datetime型別有效,而對timestamp無效,因為timestamp總是要求乙個合法的輸入。

3. ansi_quotes:啟用ansi_quotes後,不能用雙引號來引用字串,因為它將被解釋為識別符。

4. error_for_division_by_zero:在insert或update過程中,如果資料被零除(或mod(x,0)),則產生錯誤(否則為警告)。如果未給出該模式,那麼資料被零除時mysql返回null。如果用到insert ignore或update ignore中,mysql生產被零除警告,但操作結果為null。

5. high_not_precedence:操作符的優先順序是表示式。

6. ignore_space:函式名和括號"("之間有空格。除了增加一些煩惱,這個選項好像沒有任何好處,要訪問儲存為關鍵字的資料庫、表或列名,使用者必須引用該選項。

7. no_auto_create_user:禁止grant建立密碼為空的使用者。

8. no_auto_value_no_zero:該選項影響列為自增長的插入。在預設設定下,插入0或null代表生成下乙個自增長值。如果使用者希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了。

9. no_backslash_escapes:反斜槓"\"作為普通字元而非轉義符。

10. no_dir_in_create:在建立表時忽視所有index directory和date directory的選項。

11. no_engine_substitution:如果需要的儲存引擎被禁用或為編譯,那麼丟擲錯誤。預設用預設的儲存引擎替代,並丟擲乙個異常。

12. no_unsigned_subtraction:啟用這個選項後兩個unsigned型別相減返回signed型別。

13. no_zero_date:在非嚴格模式下,可以插入形如"0000-00-00 00:00:00"的非法日期,mysql僅會丟擲乙個警告。而啟用該選項後,mysql資料庫不允許插入零日期,插入零日期會丟擲錯誤而非警告。

14. no_zero_in_date:在嚴格模式下,不允許日期和月份為零。如"2011-00-01"或"2011-01-00"這樣的格式是不允許的。採用日期或月份為零的格式時mysql都會直接丟擲錯誤而非警告。

15. only_full_group_by:對於group by聚合操作,如果在select中的列沒有在group by**現,那麼這句sql是不合法的。

16. pad_char_to_full_length:對於char型別字段,不要截斷空洞資料。空洞資料都是自動填充為0x20的資料。

17. pipes_as_concat:將"||"視為空字串的連線操作符而非或運算子,這和oracle資料庫是一樣的,也和字串的拼接函式concat()相類似。

18. real_as_float:將real視為float的同義詞,而不是double的同義詞。

19. strict_all_tables:將對所有引擎的表都啟用嚴格模式。在嚴格模式下,一旦任何操作的資料產生問題,都會終止當前的操作。對於啟用strict_all_tables選項的非事務引擎來說,這時資料可能停留在乙個未知的狀態。

## 2.3 日期和時間型別

1. mysql資料庫中有五種與日期和時間有關的資料型別,各種日期資料型別所佔空間如下所示:

1. datetime: 8byte

2. date: 3byte

3. timestamp: 4byte

4. year: 1byte

5. time: 3byte

### 2.3.1 datetime和date

1. datetime占用8位元組,是占用空間最多的一種日期型別。它既顯示了時間,同時也顯示了時間。date占用3個位元組,只顯示了日期。

2. mysql 5.6.4版本開始,mysql增加了對秒的小數部分(fractional second)的支援,具體語法為:type_name(fsp)

3. 其中,type_name的型別可以是time、datetime和timestamp。fsp表示支援秒的小數部分的精度,最大為6,表示微妙(microseconds):預設為0,表示沒有小數部分,同時也是為了相容之前版本中的time、datetime和timestamp型別。對於時間型別,如curtime()、sysdate()和utc_timestamp()也增加了fsp的支援。

### 2.3.2 timestamp

1. timestamp和datetime顯示的結果是一樣的,都是固定的"yyyy-mm-dd hh:mm:ss"的形式。不同的是,timestamp占用4位元組,顯示的範圍為"1970-01-01 00:00:00"utc到"2038-01-19 03:14:07"utc。其實際儲存的內容為"1970-01-01 00:00:00"到當前時間的毫秒數。

2. timestamp型別和datetime型別除了在顯示時間範圍上有所不同外,還有以下不同:

1. 在建表時,列為timestamp的日期型別可以設定乙個預設值,而datetime不行。

2. 在更新表時,可以設定timestamp型別的列自動更新時間為當前時間。

3. 如果執行了update操作,當時間上行並沒有得到更新,那麼是不會更新列的timestamp值。

### 2.3.3 year和time

1. year型別占用了1位元組,並且在定義時可以顯示的寬度為year(4)或year(2)。

2. time型別佔3位元組,顯示的範圍為"-838:59:59~838:59:59"。因為time型別不僅可以用來儲存一天中的時間,也可以用來儲存時間間隔,同時這也解釋了為什麼time型別也可以存在負值。和datetime型別一樣,time型別同樣可以顯示微秒時間,但是在插入時,資料庫同樣會進行截斷操作。

### 2.3.4 與日期和事件相關的函式

1. 日期函式可能是比較常使用的一種函式。下面介紹一些最常見的日期函式及一些容易忽略的問題。

2. now、current_timestamp和sysdate

1. ## 2.4 關於日期的經典sql程式設計問題

## 2.5 數字型別

## 2.6 關於數字的經典sql程式設計問題

## 2.7 字元型別

## 2.8 小結

讀MySQL技術內幕筆記

1.mysql 單程序多執行緒 2.資料庫和例項的定義 3.mysql組成部門 連線池元件 管理服務和工具元件 sql介面元件 查詢分析器元件 優化器元件 緩衝 cache 元件 外掛程式式儲存引擎 物理檔案 4.innodb後台執行緒 master thread io thread purge 清...

MySQL技術內幕

innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...

MySQL技術內幕(一)

1.mysql是一種可移植的資料庫,可在多種平台下使用,如linux,solaris,freebsd,mac,windows 2.資料庫和資料庫例項的區別 資料庫是指物理上儲存的檔案的集合 資料庫例項是由後台的執行緒 程序和共享記憶體區組成,操縱資料庫檔案。3.mysql區別於其他資料庫的最重要的特...