<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                **目錄** [TOC] # 1 表格與儲存引擎 表格(table)是數據庫中用來儲存紀錄的基本單位,在建立一個新的數據庫以后,你必須為這個數據庫建立一些儲存資料的表格: [![mysql_08_snap_01](http://box.kancloud.cn/2015-09-15_55f7e84a3a7d1.png)](http://box.kancloud.cn/2015-09-15_55f7e84a3a7d1.png) 每一個數據庫都會使用一個資料夾,這些數據庫資料夾用來儲存所有數據庫各自需要的檔案: [![mysql_08_snap_02](http://box.kancloud.cn/2015-09-15_55f7e84d02adb.png)](http://box.kancloud.cn/2015-09-15_55f7e84d02adb.png) “Storage engine、儲存引擎”是MySQL用來儲存資料的技術,為了數據庫多樣化的應用,你可以在建立表格的時候,依照自己的需求指定一種儲存引擎,不同的儲存引擎會有不同的資料儲存方式與運作的特色。MySQL提供許多儲存引擎讓你選擇,下列是主要的三種儲存引擎的簡介: * MyISAM:MySQL默認的儲存引擎,雖然它支援的功能并沒有像一般的數據庫那么多(例如交易、transaction);不過也因為它比較簡單,所以運作的效率相對也比較好 * InnoDB:這種儲存引擎所提供的功能已經跟大型的商用數據庫軟件一樣了,像是交易(transaction)、紀錄鎖定(row-level locking) 與自動回復(auto-recovery)。 * MEMORY:這是一個比較特殊的儲存引擎,它把資料儲存在紀憶體中,所以運作的效率是最快的;不過只要MySQL服務器關閉后,儲存的資料就全部不見了。 ## 1.1 MyISAM “MyISAM”是MySQL默認的儲存引擎,“默認”的意思是如果你在建立表格的時候沒有指定一種儲存引擎,MySQL會幫你建立的新表格指定為“MyISAM”儲存引擎。以下列一個使用MyISAM儲存引擎的數據庫來說,在數據庫資料夾中的檔案會像這樣: [![mysql_08_snap_03](http://box.kancloud.cn/2015-09-15_55f7e8539b492.png)](http://box.kancloud.cn/2015-09-15_55f7e8539b492.png) 當你建立一個表格以后,“MyISAM”儲存引擎會建立以表格名稱為檔案名稱的三個檔案,以“city”表格來說: [![mysql_08_snap_04](http://box.kancloud.cn/2015-09-15_55f7e8543e60e.png)](http://box.kancloud.cn/2015-09-15_55f7e8543e60e.png) 使用“MyISAM”儲存引擎的數據庫具有“可攜性、portable”的特色,你可以很容易的把一個數據庫復制到另外一臺電腦的MySQL服務器中: [![mysql_08_snap_05](http://box.kancloud.cn/2015-09-15_55f7e854ab4ed.png)](http://box.kancloud.cn/2015-09-15_55f7e854ab4ed.png) 注:使用“MyISAM”儲存引擎時,MySQL并不會限制一個數據庫中可以包含的表格數量。不過一個表格會在檔案系統中建立三個檔案,如果超過作業系統對于檔案數量或容量的限制,你就不能再建立任何新的表格。 ## 1.2 InnoDB MySQL數據庫服務器從3.23.49版本開始把“InnoDB”儲存引擎列為正式支援的功能,所以從這個版本開始,MySQL也提供與大型商用數據庫軟件一樣的功能。最主要的功能是支援“交易、transaction”,在比較復雜的數據庫應用系統中,很常遇到這樣的情況: [![mysql_08_snap_06](http://box.kancloud.cn/2015-09-15_55f7e855394d4.png)](http://box.kancloud.cn/2015-09-15_55f7e855394d4.png) 在順利的情況下,當然不會有任何問題。可是如果發生下列的情況: [![mysql_08_snap_07](http://box.kancloud.cn/2015-09-15_55f7e8559c64b.png)](http://box.kancloud.cn/2015-09-15_55f7e8559c64b.png) 這樣的情況是一定要避免,否則數據庫中儲存的資料就會出現很大的問題了。所以一般的大型商用數據庫都會使用交易的功能來處理這樣的情況: [![mysql_08_snap_08](http://box.kancloud.cn/2015-09-15_55f7e86168f52.png)](http://box.kancloud.cn/2015-09-15_55f7e86168f52.png) “InnoDB”儲存引擎除了提供許多功能外,與“MyISAM”儲存引擎最大的差異是檔案的儲存方式: [![mysql_08_snap_09](http://box.kancloud.cn/2015-09-15_55f7e861ea9a8.png)](http://box.kancloud.cn/2015-09-15_55f7e861ea9a8.png) “InnoDB”儲存引擎實際儲存在檔案系統中的檔案會像這樣: [![mysql_08_snap_10](http://box.kancloud.cn/2015-09-15_55f7e862423fa.png)](http://box.kancloud.cn/2015-09-15_55f7e862423fa.png) 注:因為使用“InnoDB”儲存引擎的表格會使用同一個儲存空間,所以不同數據庫的表格資料也會儲存在一起。“InnoDB”儲存引擎限制在這個共用的儲存空間中不能超過兩百萬個表格。 ## 1.3 MEMORY “MEMORY”儲存引擎與其它儲存引擎有一個主要的差異,就是它會把紀錄與索引資料儲存在內存中。所以使用“MEMORY”儲存引擎的表格,不論在查詢或維護資料時的效率都是很好的。在檔案系統中儲存的檔案只有“frm”檔,也就是儲存表格結構資訊的檔案: [![mysql_08_snap_11](http://box.kancloud.cn/2015-09-15_55f7e866c5af6.png)](http://box.kancloud.cn/2015-09-15_55f7e866c5af6.png) 注:因為“MEMORY”儲存引擎會把紀錄與索引資料儲存在內存中,所以只要MySQL服務器關閉、重新啟動、當機,所有使用“MEMORY”儲存引擎的表格資料都會全部消失,只剩下表格結構;它也不適合儲存大量資料的表格,會耗用太多內存 ## 1.4 儲存引擎與作業系統 雖然MySQL數據庫是一個獨立運作的軟件,不過它還是得安裝在某一個作業系統中,例如Windows或Linux。而由作業系統控制的檔案系統可能會有許多限制,例如檔案的數量和檔案的大小。如果MySQL數據庫軟件在建立或使用數據庫檔案的時候,超過作業系統的限制,就會發生錯誤。 如果以支援的功能來決定儲存引擎的話,那就會比較明確。如果要以作業系統的限制來決定儲存引擎的話,你可以參考下列的作法: * 使用“MyISAM”儲存引擎可以避免違反檔案大小的限制 * 使用“InnoDB”儲存引擎可以避免違反檔案數量的限制 * 如果在檔案數量與大小的限制都遇到問題的話,你只好增加硬件和修改作業系統在檔案系統上的設定 # 2 字段資料型態 在建立表格時,你會幫每一個字段指定適合的“資料型態、data type”。正確的選擇字段資料型態,除了可以幫你儲存正確的資料外,還可以讓數據庫使用最少的內存與儲存空間,這樣會讓數據庫運作的效率更好一些。資料型態主要分為下列三大類: * 數值:任何包含正、負號的整數與小數資料;另外還有位元(bit)的數值資料,它使用二進制來表示一個數字。 * 字串:包含non-binary與binary兩種字串值,non-binary字串值是一些使用字符集與collation的字符(character)組合起來的;binary字串值是一些字節(bytes)組合的資料。 * 日期與時間:包含日期、時間與日期加時間。 ## 2.1 數值 數值資料分為整數與小數資料,下列是MySQL提供的整數型態: | 型態 | **Byte(s)** | **默認長度** | **有號數范圍** | **無號數范圍** | | --- | --- | --- | --- | --- | | TINYINT[(長度)] | 1 | 4 | -128~127 | 0~255 | | SMALLINT[(長度)] | 2 | 6 | -32768~32767 | 0~65535 | | MEDIUMINT[(長度)] | 3 | 9 | -8388608~8388607 | 0~16777215 | | INT[(長度)] | 4 | 11 | -2147683648~2147683647 | 0~4294967295 | | BIGINT[(長度)] | 8 | 20 | -9223372036854775808~9223372036854775807 | 0~18446744073709551615 | 整數型態的意思就是它們不能儲存小數,在建立表格的時候,如果需要一個可以儲存整數資料的字段,你可以依照整數資料的大小需求,選擇一個夠用又不會太浪費空間的整數形態。以下列的“cmdev.integertable”表格來說: | **字段名稱** | **型態** | **范圍** | | --- | --- | --- | | n | TINYINT(4) | -128~127 | | n2 | SMALLINT(6) | -32768~32767 | | n3 | MEDIUMINT(9) | -8388608~8388607 | | n4 | INT(11) | -2147683648~2147683647 | | n5 | BIGINT(20) | -9223372036854775808~9223372036854775807 | 整數型態的后面會在左右刮號中指定一個數字,以“SMALLING”型態來說: [![mysql_08_snap_12](http://box.kancloud.cn/2015-09-15_55f7e8672f909.png)](http://box.kancloud.cn/2015-09-15_55f7e8672f909.png) 當你在執行資料的新增或修改的時候,就要特別注意它們的可以儲存數字的范圍: [![mysql_08_snap_13](http://box.kancloud.cn/2015-09-15_55f7e87690ade.png)](http://box.kancloud.cn/2015-09-15_55f7e87690ade.png) 整數型態的字段,就表示它們不可以儲存小數的數值: [![mysql_08_snap_14](http://box.kancloud.cn/2015-09-15_55f7e87bcd8fa.png)](http://box.kancloud.cn/2015-09-15_55f7e87bcd8fa.png) 數值型態還有下列幾種可以儲存小數資料的浮點數型態: | **型態** | **Byte(s)** | **默認長度** | **最大長度** | **說明** | | --- | --- | --- | --- | --- | | FLOAT[(長度,小數位數)] | 4 | 注1 | 255, 30 | 單精確度浮點數(近似值) | | DOUBLE[(長度,小數位數)] | 8 | | 255, 30 | 雙精確度浮點數(近似值) | | DECIMAL[(長度[,小數位數])] | 注2 | 10, 0 | 65, 30 | 自行指定位數的精確值 | 注1:FLOAT與DOUBLE的默認長度會因為不同的作業系統而有不一樣的長度? 注2:依照指定的位數決定實際儲存的空間 “FLOAT”和“DOUBLE”型態的字段可以用來儲存包含小數的數值,儲存空間分別是4和8個字節,它們是一種占用儲存空間比較小,執行運算比較快的型態。不過因為它們是使用“近似值”來儲存你的數值,所以如果你需要儲存完全精準的數值,就不能使用這兩種型態。 另外一種可以儲存小數數值的“DECIMAL”型態就可以用來儲存完全精準的數值,儲存在這個型態中的數值,不論是查詢或是運算,都不會有任何誤差,不過“DECIMAL”型態占用的儲存空間就比“FLOAT”和“DOUBLE”型態大。“DECIMAL”型態在MySQL還有一個一樣的關鍵字是“NUMERIC”,這兩種型態完全一樣。 在MySQL中,“FLOAT”、“DOUBLE”和“DECIMAL”都可以依照自己的需要設定長度與位數: [![mysql_08_snap_15](http://box.kancloud.cn/2015-09-15_55f7e87f4b8c2.png)](http://box.kancloud.cn/2015-09-15_55f7e87f4b8c2.png) 在設定長度與小數位數的時候,要注意下列幾個規則: * 不可以超過最大長度 * 小數位數不可以超過長度 * 長度與小數位數一樣的時候,表示只可以儲存小數,例如“0.123” MySQL的數值型態,包含整數與浮點數都可以設定為“只能儲存正數”,以下列的“cmdev.numerictable”表格來說: | **字段名稱** | **型態** | | --- | --- | | i | TINYINT(3) UNSIGNED | | i2 | SMALLINT(5) UNSIGNED | | i3 | MEDIUMINT(8) UNSIGNED | | i4 | INT(10) | | i5 | BIGINT(20) UNSIGNED | | f | FLOAT UNSIGNED | | f2 | DOUBLE | | f3 | DECIMAL(10, 0) UNSIGNED | 設定為只能儲存正數的字段,就跟字面上的效果一樣,任何希望儲存負數的動作都會造成錯誤: [![mysql_08_snap_16](http://box.kancloud.cn/2015-09-15_55f7e87fc3351.png)](http://box.kancloud.cn/2015-09-15_55f7e87fc3351.png) MySQL的數值型態都可以依照自己的需要設定長度,以下列的“cmdev.numerictable2”表格來說: | **字段名稱** | **型態** | | --- | --- | | i | TINYINT(3) | | i2 | SMALLINT(3) | | i3 | MEDIUMINT(3) | | i4 | INT(3) | | i5 | BIGINT(3) | | f | FLOAT(5, 2) | | f2 | DOUBLE(5, 2) | | f3 | DECIMAL(5, 2) | 同樣為數值型態設定長度,在整數和浮點數會有不一樣的效果。如果你為整數型態的字段設定長度的話,這個長度只是設定顯示的長度而已,并不會影響實際儲存的長度: [![mysql_08_snap_17](http://box.kancloud.cn/2015-09-15_55f7e8852e81a.png)](http://box.kancloud.cn/2015-09-15_55f7e8852e81a.png) 為浮點數型態設定長度與小數位數的時候,效果就跟整數型態不一樣了: [![mysql_08_snap_18](http://box.kancloud.cn/2015-09-15_55f7e88faf65b.png)](http://box.kancloud.cn/2015-09-15_55f7e88faf65b.png) 不過在整數位數的部份,就一定會依照設定來儲存,否則會造成錯誤: [![mysql_08_snap_19](http://box.kancloud.cn/2015-09-15_55f7e8901949e.png)](http://box.kancloud.cn/2015-09-15_55f7e8901949e.png) MySQL的在數值型態的設定上,還有一個比較特別的設定,就是“ZEROFILL”,以下列的“cmdev.numerictable3”表格來說: | **字段名稱** | **型態** | | --- | --- | | i | TINYINT(3) UNSIGNED ZEROFILL | | i2 | SMALLINT(4) UNSIGNED ZEROFILL | | i3 | MEDIUMINT(5) UNSIGNED ZEROFILL | | i4 | INT(6) UNSIGNED ZEROFILL | | i5 | BIGINT(7) UNSIGNED ZEROFILL | | f | FLOAT(5, 2) UNSIGNED ZEROFILL | | f2 | DOUBLE(7, 3) UNSIGNED ZEROFILL | | f3 | DECIMAL(9, 5) UNSIGNED ZEROFILL | “ZEROFILL”的設定表示在查詢這些字段的時候,回傳的資料會在左側根據長度的設定填滿“0”: [![mysql_08_snap_20](http://box.kancloud.cn/2015-09-15_55f7e89071b74.png)](http://box.kancloud.cn/2015-09-15_55f7e89071b74.png) 注:“ZEROFILL”一定要跟“UNSIGNED”一起使用,就算你只有為字段設定“ZEROFILL”,MySQL也會自動加入“UNSIGNED”的設定。 整數型態的部份,在補0的處理上會不太一樣: [![mysql_08_snap_21](http://box.kancloud.cn/2015-09-15_55f7e890e8dd4.png)](http://box.kancloud.cn/2015-09-15_55f7e890e8dd4.png) ## 2.2 位元 “位元、BIT”型態其實也是用來儲存數值用的,不過它是以二進制的型式儲存資料,也就是只有0跟1兩種資料。MySQL的在數值型態的設定上,還有一個比較特別的設定,就是“ZEROFILL”,以下列的“cmdev.numerictable3”表格來說: | **字段名稱** | **型態** | **數字范圍** | | --- | --- | --- | | n | BIT | 0~1 | | n2 | BIT(8) | 0~255 | | n3 | BIT(64) | 0~18446744073709551615 | 你可以直接儲存數字到位元型態的字段;也可以指定一個使用二進制表示的值: [![mysql_08_snap_22](http://box.kancloud.cn/2015-09-15_55f7e89128f6a.png)](http://box.kancloud.cn/2015-09-15_55f7e89128f6a.png) ## 2.3 字串 MySQL把字串型態分為兩大類:“非二進位制、non-binary”與“二進位制、binary”。非二進位制就是儲存一般文字的字串,會有特定的字符集與collation;二進位制使用字節儲存資料,不包含字符集與collation,所以大多用來儲存圖片或音樂這類資料。“非二進位制、non-binary”的字串型態有下列幾種: | **型態** | **最大長度** | **實際儲存的空間** | **說明** | | --- | --- | --- | --- | | CHAR[(長度)] | 255 | 指定的長度 | 固定長度的字串,默認長度為1 | | VARCHAR(長度) | 65535 | 字符個數加1或2bytes | 變動長度的字串 | | TINYTEXT | 255 | 字符個數加1byte | | | TEXT | 65535 | 字符個數加2bytes | | | MEDIUMTEXT | 16,772,215 | 字符個數加3bytes | | | LONGTEXT | 4,294,967,295 | 字符個數加4bytes | | 固定長度與變動長度的兩種字串型態都可以儲存字串,差異在儲存的文字個數小于型態指定的長度時,變動長度實際儲存的空間會小一些,以下列的“cmdev.nonbinarytable”表格來說: | **字段名稱** | **型態** | | --- | --- | | s | CHAR(10) | | s2 | VARCHAR(10) | 同樣把長度設定為10的“CHAR”與“VARCHAR”字串型態,它們在儲存字串資料的時候會不太一樣: [![mysql_08_snap_23](http://box.kancloud.cn/2015-09-15_55f7e8a069968.png)](http://box.kancloud.cn/2015-09-15_55f7e8a069968.png) “非二進位制、non-binary”的字串都會包含特定的字符集與collation,所以可以用來儲存各種不同國家的文字。不同的字符集會占用不同的儲存空間,以下列的“cmdev.nonbinarytable2”表格來說: | **字段名稱** | **型態** | **字符集** | | --- | --- | --- | | s | VARCHAR(6) | latin1 | | s2 | VARCHAR(6) | big5 | | s3 | VARCHAR(6) | utf8 | 上列的表格中,三個字段分別設定為“latin1”、“big5”與“utf8”字符集,你可以查詢MySQL數據庫支援的字符集特性,“MAXLEN”字段是關于儲存空間的資訊: [![mysql_08_snap_24](http://box.kancloud.cn/2015-09-15_55f7e8a0acfcc.png)](http://box.kancloud.cn/2015-09-15_55f7e8a0acfcc.png) 使用在“LENGTH”函式來查詢儲存在這個表格中的字串資料,就可以很明顯的看出不同的字符集,在儲存字符時使用的儲存空間: [![mysql_08_snap_25](http://box.kancloud.cn/2015-09-15_55f7e8a5e85ec.png)](http://box.kancloud.cn/2015-09-15_55f7e8a5e85ec.png) “LENGTH”函式會傳回字串資料實際的儲存長度(byte);如果你要查詢字串的字符數量的話,就要使用“CHAR_LENGTH”函式: [![mysql_08_snap_26](http://box.kancloud.cn/2015-09-15_55f7e8ab3414c.png)](http://box.kancloud.cn/2015-09-15_55f7e8ab3414c.png) 字符集會影響字串的儲存空間,collation會影響字串排列順序。以下列的“cmdev.nonbinarytable3”表格來說: | 字段名稱 | 型態 | 字符集 | Collation | | --- | --- | --- | --- | | s | VARCHAR(6) | latin1 | latin1_general_ci | | s2 | VARCHAR(6) | latin1 | latin1_general_cs | 上列表格中字段的字符集都指定為“latin1”,不過“s”字段的collation設定為“latin1_general_ci”,表示排序時不區分大小寫;“s2”字段設定為“latin1_general_cs”,表示排序時會區分大小寫。以下列儲存在這個表格中紀錄來說: [![mysql_08_snap_27](http://box.kancloud.cn/2015-09-15_55f7e8ad2576a.png)](http://box.kancloud.cn/2015-09-15_55f7e8ad2576a.png) Collation設定中的“latin1_general_ci”,最后的“ci”表示“case insensitive”,是不分大小寫的意思。在這樣的設定下,MySQL會把字串“ABC”和“abc”當成是一樣的;“latin1_general_cs”,最后的“cs”表示“case sensitive”,是區分大小寫的意思。在這樣的設定下,MySQL就會把字串“ABC”和“abc”當成是不一樣的字串。 是否區分大小寫的collation設定會影響排序的結果: [![mysql_08_snap_28](http://box.kancloud.cn/2015-09-15_55f7e8b34aa3e.png)](http://box.kancloud.cn/2015-09-15_55f7e8b34aa3e.png) 另外一個影響是條件的判斷: [![mysql_08_snap_29](http://box.kancloud.cn/2015-09-15_55f7e8b3d6f67.png)](http://box.kancloud.cn/2015-09-15_55f7e8b3d6f67.png) “二進位制、binary”的字串型態是使用字節(byte)為單位來儲存字串資料,跟非二進位制的字串類似,它也提供許多應用在不同長度的型態: | 型態 | 最大長度(byte) | 實際儲存的空間(byte) | 說明 | | --- | --- | --- | --- | | BINARY[(長度)] | 255 | 指定的長度 | 固定長度的字串,默認長度為1 | | VARBINARY(長度) | 65535 | 長度加1或2bytes | 變動長度的字串 | | TINYBLOB | 255 | byte數加1byte | | | BLOB | 65535 | byte數加2bytes | | | MEDIUMBLOB | 16,772,215 | byte數加3bytes | | | LONGBLOB | 4,294,967,295 | byte數加4bytes | | “BINARY”與“VARBINARY”兩種型態的差異,與“CHAR”和“VARCHAR”的差異一樣。在一般的情況下,使用“VARBINARY”會比“BINARY”節省一點儲存空間。你也可以使用“二進位制、binary”型態儲存文字資料,只不過MySQL都是以字節來儲存所有的資料,也就是0到255的數字: [![mysql_08_snap_30](http://box.kancloud.cn/2015-09-15_55f7e8b45c6d1.png)](http://box.kancloud.cn/2015-09-15_55f7e8b45c6d1.png) 所有“二進位制、binary”的字串型態都不可以指定字符集與collation,不過你可以使用它們來儲存任何語言的文字,也可以儲存類似音樂或圖片資料,因為MySQL都是一個一個byte的把資料儲存到數據庫中;所以在執行查詢時的排序和條件設定,都是以使用字節為單位來判斷。 ## 2.4 列舉與集合 列舉(ENUM)與集合(SET)是一種特殊的“非二進位制、non-binary”字串型態,所以它們也可以指定字符集與collation。下列是這兩種型態的說明: | 型態 | 最大個數 | 儲存空間 | 說明 | | --- | --- | --- | --- | | ENUM(字串值[,...]) | 65535 | 1byte(255個)2bytes(256到65535個) | 包含一組合法的字串值(單一值) | | SET(字串值[,...]) | 64 | 1byte(8個)2bytes(16個)3bytes(24個)4bytes(32個)8bytes(64個) | 包含一組合法的字串值(多個值) | 列舉(enumeration)的資料在數據庫中的應用很常見,例如服裝的大小就會以S、M與L來表示小、中與大。你可以使用字串來儲存這類資料,不過這類的資料也很適合使用“ENUM”型態來儲存。以下列的“cmdev.enumtable”表格來說: [![mysql_08_snap_31](http://box.kancloud.cn/2015-09-15_55f7e8b9a33df.png)](http://box.kancloud.cn/2015-09-15_55f7e8b9a33df.png) 在儲存資料的時候,“ENUM”型態看起來似乎與“VARCHAR”完全一樣: [![mysql_08_snap_32](http://box.kancloud.cn/2015-09-15_55f7e8b9dc896.png)](http://box.kancloud.cn/2015-09-15_55f7e8b9dc896.png) 可是列舉型態在資料的正確性方面,就會比單純的字串型態好多了。例如下列錯誤示范: [![mysql_08_snap_33](http://box.kancloud.cn/2015-09-15_55f7e8ba60a67.png)](http://box.kancloud.cn/2015-09-15_55f7e8ba60a67.png) 列舉型態字段除了可以直接使用字串值來新增與更新資料外,還可以使用數值資料的編號來代替,任何一個列舉型態中的成員,MySQL都會幫它們編一個號碼: [![mysql_08_snap_34](http://box.kancloud.cn/2015-09-15_55f7e8bacd743.png)](http://box.kancloud.cn/2015-09-15_55f7e8bacd743.png) 了解列舉型態中成員的編號以后,你可以選擇字串值或數值來管理列舉型態字段儲存的資料: [![mysql_08_snap_35](http://box.kancloud.cn/2015-09-15_55f7e8bb32038.png)](http://box.kancloud.cn/2015-09-15_55f7e8bb32038.png) 雖然在查詢列舉型態字段資料的時候,所得到的結果都是成員的字串值;不過真正儲存在數據庫中的資料卻是成員的編號,所以指定列舉型態字段為排序字段的時候,數據庫會使用編號來排序,而不是以成員的字串值: [![mysql_08_snap_36](http://box.kancloud.cn/2015-09-15_55f7e8bbb8ba4.png)](http://box.kancloud.cn/2015-09-15_55f7e8bbb8ba4.png) 在指定列舉型態字段的查詢條件時,可以使用成員的字串值或編號: [![mysql_08_snap_37](http://box.kancloud.cn/2015-09-15_55f7e8bc66f72.png)](http://box.kancloud.cn/2015-09-15_55f7e8bc66f72.png) 集合(SET)型態同樣可以設定一組成員,不過它可以儲存多個成員資料。例如星期的成員總共有七個,而需要工作的星期就會有一個以上了,類似這樣的需求就應該使用集合型態。以下列的“cmdev.settable”表格來說: | 字段名稱 | 型態 | | --- | --- | | workingday | SET(‘MON’,'TUE’,'WED’,'THU’,'FRI’,'SAT’,'SUN’) | 你可以使用一個字串值來管理集合型態字段,在這個字串值中,使用逗號來隔開不同的成員字串: [![mysql_08_snap_38](http://box.kancloud.cn/2015-09-15_55f7e8bca5c85.png)](http://box.kancloud.cn/2015-09-15_55f7e8bca5c85.png) 集合型態字段與列舉型態字段同樣具有檢查資料是否正確的能力: [![mysql_08_snap_39](http://box.kancloud.cn/2015-09-15_55f7e8bd09eff.png)](http://box.kancloud.cn/2015-09-15_55f7e8bd09eff.png) 列舉型態字段的成員編號使用簡單的連續數字;集合型態字段會比較復雜一些: [![mysql_08_snap_40](http://box.kancloud.cn/2015-09-15_55f7e8bd50a06.png)](http://box.kancloud.cn/2015-09-15_55f7e8bd50a06.png) 了解集合型態字段的成員所代表的數字后,你就可以使用數值來管理儲存的資料: [![mysql_08_snap_41](http://box.kancloud.cn/2015-09-15_55f7e8c2911c4.png)](http://box.kancloud.cn/2015-09-15_55f7e8c2911c4.png) 要使用數值來代表多個成員的時候,你只要把所有成員的數字加總起來就可以了: [![mysql_08_snap_42](http://box.kancloud.cn/2015-09-15_55f7e8c7d130b.png)](http://box.kancloud.cn/2015-09-15_55f7e8c7d130b.png) 列舉與集合型態都可以設定需要的字符集與collation,以下列的“cmdev.estable”表格來說: | 字段名稱 | 型態 | 字符集 | Collation | | --- | --- | --- | --- | | enumsize | enum(‘XS’, …) | latin1 | latin1_general_ci | | enumsize2 | enum(‘XS’, …) | latin1 | latin1_general_cs | | workingday | set(‘MON’, …) | latin1 | latin1_general_ci | | workingday2 | set(‘MON’, …) | latin1 | latin1_general_cs | 字符集的設定可以決定可以儲存字串資料的編碼,而collation的設定會決定字串值是否區分大小寫: [![mysql_08_snap_43](http://box.kancloud.cn/2015-09-15_55f7e8cd613d7.png)](http://box.kancloud.cn/2015-09-15_55f7e8cd613d7.png) 如果指定字串值的時候違反collation設定的大小寫規則,就會發生錯誤: [![mysql_08_snap_44](http://box.kancloud.cn/2015-09-15_55f7e8cdbe9b5.png)](http://box.kancloud.cn/2015-09-15_55f7e8cdbe9b5.png) ## 2.5 日期與時間 MySQL提供下列幾個可以儲存日期與時間資料的字段型態: | 型態 | Byte(s) | 說明 | 范圍 | | --- | --- | --- | --- | | DATE | 3 | 日期 | ’1000-01-01′~’9999-12-31′ | | TIME | 3 | 時間 | ‘-838:59:59′~’838:59:59′ | | DATETIME | 8 | 日期與時間 | ’1000-01-01 00:00:00′~’9999-12-31 23:59:59′ | | YEAR[(4 | 2)] | 1 | 西元年 | 1901~2155[YEAR(4)]1970~2069[YEAR(2)] | | TIMESTAMP | 4 | 日期與時間 | ’1970-01-01 00:00:00′~2037 | 日期(DATE)型態字段可以儲存年、月、日的資料,范圍從“1000-01-01”到“9999-12-31”,你的日期資料不可以超過“9999-12-31”,可是你可以儲存“1000-01-01”以前的日期,不過MySQL建議你最好不要這么作,不然可能會造成一些奇怪的問題。 因為日期中的西元年份可以使用四個或兩個數字,使用兩個數字的時候,“70”到“99”表示“1970”到“1999”;如果是“00”到“69”就是“2000”到“2069”。所以要注意下列的情況: [![mysql_08_snap_45](http://box.kancloud.cn/2015-09-15_55f7e8ce3886d.png)](http://box.kancloud.cn/2015-09-15_55f7e8ce3886d.png) 另一個日期資料會變成這樣: [![mysql_08_snap_46](http://box.kancloud.cn/2015-09-15_55f7e8ce7b922.png)](http://box.kancloud.cn/2015-09-15_55f7e8ce7b922.png) 時間(TIME)型態可以儲存時、分、秒的資料,范圍從“-838:59:59”到“838:59:59”。這個儲存時間資料的范圍可能會跟你想的不太一樣。一般來說,時間資料指的是從“00:00:00”到“23:59:59”,也就是一天的時間。MySQL的時間型態字段可以讓你儲存類似“經過的時間”這樣的資料: [![mysql_08_snap_47](http://box.kancloud.cn/2015-09-15_55f7e8ceceb94.png)](http://box.kancloud.cn/2015-09-15_55f7e8ceceb94.png) 在指定一個時間資料的時候,你可以省略秒或分,省略的部份,MySQL都會幫你設定為“0”: [![mysql_08_snap_48](http://box.kancloud.cn/2015-09-15_55f7e8cf38f61.png)](http://box.kancloud.cn/2015-09-15_55f7e8cf38f61.png) 日期與時間(DATETIME)型態可以儲存完整的年、月、日與時、分、秒資料,范圍從“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。在表示一個日期與時間資料的時候,日期與時間之間,至少要使用一個空白隔開。時間部份的時、分、秒都可以省略,省略的部份,MySQL都會幫你設定為“0”: [![mysql_08_snap_49](http://box.kancloud.cn/2015-09-15_55f7e8d4b276a.png)](http://box.kancloud.cn/2015-09-15_55f7e8d4b276a.png) 如果只需要儲存年份資料的話,你可以使用西元年(YEAR)型態,這樣會節省很多儲存空間。你可以視需要把西元年型態設定為兩位或四位數字,四位數字可以儲存的范圍從“1901”到“2155”;兩位數字的范圍從“00”到“99”,實際的西元年份是“1970”到“2069”。 在指定一個年份資料給西元年型態字段的時候,可以使用字串值或數值來表示西元年份,不同個數的資料會有不同的儲存效果: [![mysql_08_snap_50](http://box.kancloud.cn/2015-09-15_55f7e8d6ec46d.png)](http://box.kancloud.cn/2015-09-15_55f7e8d6ec46d.png) 如果西元年型態字段的值是“0”的話,MySQL會把它當成是一個不正確的西元年資料,所以你應該不會指定這樣的資料,不過指定不同的資料也會有不同的儲存結果: [![mysql_08_snap_51](http://box.kancloud.cn/2015-09-15_55f7e8d77067e.png)](http://box.kancloud.cn/2015-09-15_55f7e8d77067e.png) “TIMESTAMP”型態的格式與“DATETIME”一樣,都包含完整的年、月、日與時、分、秒資料,不過它使用的儲存空間只有4bytes,是“DATETIME”型態的一半。 “TIMESTAMP”也是MySQL日期與時間型態中具有“時區”特性的型態。它可以儲存從“1970-01-01 00:00:00”到目前經過的秒數。這個起始日期與時間使用“Coordinated Universal Time、UTC”世界標準時間為儲存資料的依據,它與“Greenwich Mean Time、GMT”格林威治標準時間是一樣的。 全世界分為許多不同時區(time zone),所有時區都使用跟標準時間的差異來當作自己的標準時間。以臺灣來說,你會在安裝Windows平臺的電腦中,經由控制臺里的日期和時間,看到這個關于時區的設定: [![mysql_08_snap_60](http://box.kancloud.cn/2015-09-15_55f7e8d7b38c8.png)](http://box.kancloud.cn/2015-09-15_55f7e8d7b38c8.png) MySQL數據庫采用與作業系統同樣的時區設定,所以在儲存“TIMESTAMP”型態字段的資料時,過程中會有一些計算的動作: [![mysql_08_snap_61](http://box.kancloud.cn/2015-09-15_55f7e8d85bd2e.png)](http://box.kancloud.cn/2015-09-15_55f7e8d85bd2e.png) 而查詢“TIMESTAMP”型態字段資料的時候,也會有這樣的情況: [![mysql_08_snap_62](http://box.kancloud.cn/2015-09-15_55f7e8d8e805a.png)](http://box.kancloud.cn/2015-09-15_55f7e8d8e805a.png) 了解時區設定與“TIMESTAMP”型態的關系后,你就可以知道下列的動作為什么會發生錯誤了: [![mysql_08_snap_55](http://box.kancloud.cn/2015-09-15_55f7e8d9325e0.png)](http://box.kancloud.cn/2015-09-15_55f7e8d9325e0.png) 你可以使用查詢敘述取得MySQL數據庫服務器關于時區的設定: [![mysql_08_snap_56](http://box.kancloud.cn/2015-09-15_55f7e8d975d39.png)](http://box.kancloud.cn/2015-09-15_55f7e8d975d39.png) 如果想要設定其它的時區,可以使用“+時時:分分”或“-時時:分分”的格式。例如日本東京時區比格林威治標準時間晚九小時,你可以設定為“+09:00”;而美國舊金山比格林威治標準時間早七小時,可以設定為“-07:00”: [![mysql_08_snap_57](http://box.kancloud.cn/2015-09-15_55f7e8df060b6.png)](http://box.kancloud.cn/2015-09-15_55f7e8df060b6.png) 設定新的時區以后,使用下列的范例測試“DATETIME”和“TIMESTAMP”兩種型態,可以看出在儲存日期時間資料上的差異: [![mysql_08_snap_58](http://box.kancloud.cn/2015-09-15_55f7e8df64430.png)](http://box.kancloud.cn/2015-09-15_55f7e8df64430.png) 因為“TIMESTAMP”型態儲存的是格林威治標準時間,所以在修改時區后,查詢得到的日期時間資料就會有差異了: [![mysql_08_snap_59](http://box.kancloud.cn/2015-09-15_55f7e8dfe0aab.png)](http://box.kancloud.cn/2015-09-15_55f7e8dfe0aab.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看