[討論] 東區幻境MariaDB系列教學02-基本概念前篇 - 討論區

[討論] 東區幻境MariaDB系列教學02-基本概念前篇

文章瀏覽次數 51 文章回覆數 6

Dack

Dack圖像(預設)

2021-08-28 09:43:13

From:219.70.166.106

在上一篇教學中,我們已把MariaDB安裝完畢。現在只要我們一開機,MariaDB就會自己跑起來等著處理任何連線。
繼續介紹MariaDB怎麼玩之前,小弟得先花點篇幅跟各位講講MariaDB乃至關聯式資料庫系統的基本概念。不然我們到後面談論資料表、值的內容時,各位就會慶煙起來了。要是不小心扼殺、埋沒到論壇上有資訊潛能之人的學習熱忱,如是重罪小弟擔戴不起。急著要玩MariaDB的朋友們,跟您保證下一篇教學一定開始講授技術性、可動手試試的內容。
要操作資料庫系統須掌握的基本概念包括「資料型別」、「資料庫架構」、「欄位屬性」及「基本指令」等等。其中最不好懂、起步時較困難者當屬資料型別的部分,我們就從資料型別的地方說起。

資料型別

為了最大化運作的速度效率,資料庫系統定義有資料型別。每個資料型別都有個別的大小、儲存、操作方式,好比數字可用於加減、字串可用於儲存文字訊息等。在MariaDB中常見的資料型別有這幾類:

  • 字串類
  • 數質類
  • 日期時間類
  • 大物件類

依使用資料庫需求的不同,我們規劃、建製系統時可在創表的那刻挑選其中的項目定義在欄位上。當然後來需求改變了,我們也能用新的資料型別修改進表。建立、修改要怎麼做我們後面會有專門的教學文跟各位詳細說明,這邊小弟先來幫各位初始化一下「資料型別」這個重要觀念。

字串類

講到這邊順便先以白話協助各位釐清一下專有名詞,要特別拿出來說說的是「字串」以及「字元」。字元(character)指的是單個文字,像「a」、「b」、「我」等等都是字元。另外會因編碼方式的不同,字元可能需要的記憶體、儲存空間也會隨之不同。
字串(string)指的是由好多具連續性、有順序的字元組起來的大串列。像我們看到的文章、LINE裡的訊息等,它們其實都是字串。
說到編碼,小弟來同場加映。所謂的編碼就是我們常聽到的「Big5」、「utf-8」等。當然世界之大語言之多,文字編碼的領域裡還有中國大陸常用的GBK、西方國家常用的latin以及美國國家標準局制定的ANSI(或稱ASCII)等等。每個編碼都會規範什麼數字代表什麼文字,這樣編碼的文字會用多少儲存空間。像ANSI編碼的字元固定就是用1個位元組,常規的utf-8編碼通常用3個位元組來存。
說完這些我們回過頭繼續今天資料型別的主題,在MariaDB中常見的字串資料型別有下面幾個。

char(size)

字串資料型別char可存儲最長255個字元的字串,這個長度由我們說的算。例如我們要一個長度為80以及長度為20的char,就寫「char(80)」、「char(20)」即可。在存資料時如果丟進來的資料在這個長度之內,系統就能順利存儲並用空白填滿後面的剩餘空間。如果系統收到了非字串資料型別的資料或進來的字串大於我們定義的長度,系統會報error並倒車到指令執行前的狀態。像郭老師他們這樣專業的開發、使用者,他們稱剛剛這個倒車動作為「回滾(rollback)」。

varchar(size)

字串資料型別varchar也是個最多能存儲255個字元數的字串型別。不用小弟講,聰明的各位一定猜得出來它的語法怎麼寫。如果我們希望它的長度是40,確實寫法就是「varchar(40)」。厲害的地方是它跟海賊王魯夫一樣伸縮自如,進來的資料如果不足當初宣告的長度系統會自己幫我們把大小調到剛剛好。以上面varchar(40)來說,系統看到傳進來的資料是小弟的名字Dack,系統會自動把長度40弄成長度4然後把資料Dack放進去。

tinytext(size)

資料型別tinytext跟資料型別char幾乎完全一樣,最大長度也是255。並且宣告時的語法也是相同的,我們就加快速度看下去囉!順便提一下,其實沒有意外的話,SQL宣告定義資料型別的語法都是「型別名稱(長度/大小)」。

binary(size)

字串資料型別binary是專門用來存放2進位資料的,最大長度為255個位元組。特別注意單位是位元組,不是字元。

text(size)

接下來的字串資料型別都是重量級,存放大量文字訊息可選用的。像這個text,最多可存放65535個字元。

mediumtext(size)

字串資料型別mediumtext就又更大了,最多能放入16777215個字元。

longtext(size)

雖小弟從來沒用過,但還是要來介紹一下字串資料型別的大魔王longtext。事實上,除了varchar小弟任何一個其他的字串資料型別都沒用過(冏)。真要放的話,longtext的最大容量高達4GB,也就是4,294,967,295個字元。

數質類

可能是因為翻譯的關係,這個資料型別的稱呼有點混亂。如果聽到「數質資料型別」、「數值類資料型別」、「數位資料型別」等等,其實指的是一樣的東西。在日常生活中說到數字,各位會想到什麼?大概就一般整數、小數、分數、根號、無理數等等是吧?在MariaDB乃至電腦的世界就沒那麼複雜了,數字只分成兩大類:沒有小數的整數以及有小數的浮點數。再來依配給空間、表達範圍的大小,這兩大類又可拆成若干種數值類資料型別。我們來瞧瞧MariaDB裡,數值類資料型別有哪些。

bit

數值資料型別bit有正負號的表達範圍從-128到127,無正負號(也就是非負整數)的表達範圍從0到255。我們只能在裡面存放整數,超過表達範圍或硬要存小數的話系統會拋出錯誤並回滾到指令執行前。

tinyint

數值資料型別tinyint跟數值資料型別bit一樣,小弟在此不多贅述。

smallint

數值資料型別smallint同樣是用於存放整數。有正負號的表達範圍從-32768到32767,無號值範圍從0到65535。

mediumint

數值資料型別mediumint也是用來存放整數的。有正負號的值表達範圍從-8388608到8388607,無符號值範圍從0到16777215。

int

數值資料型別int是最受歡迎,最常被用來存整數的整數資料型別。㠪負號表達範圍從-2147483648到2147483647,無符號值範圍從0到4294967295。

integer

數值資料型別integer跟數值資料型別int完全一樣,小弟不多贅述。

bigint

數值資料型別bigint字面翻譯叫大整數,各位可能會好奇它可以有多大。有正負號的值範圍從-9223372036854775808到9223372036854775807,無符號值範圍從0到18446744073709551615。

float

數值資料型別float中文名稱為單精度浮點數,在記憶體中需4個位元組的空間。

double

數值資料型別double中文名稱為雙精度浮點數,它相較於float多了一倍的表達範圍,需8個位元組的儲存空間。如果您剛接觸電腦系統較深入的知識可能不好理解浮點數在幹嘛,小弟來給各位說下。
電腦系統是以科學記號的邏輯處理小數的,科學記號的定義為任何數都能寫成a乘以10的m次方(a*10^m)。其中1<=a<10,m為整數。
當要存放小數時電腦會在記憶體中清出一段空間,再把這段空間分成兩部分。一部分存放a,另一部分存放m。這個a跟m會隨記憶體空間有一定的表達範圍。由於小數部分越後面的分位會因機器運作情形發生不可預期的數字浮動誤差,這個資料型別浮點數因而得名。

日期時間資料型別

說完有點不好懂的字串跟數值,我們緊接著來講時間相關的資料型別。如果您曾學習程式設計且實作過較低階的時間演算法,應該親身體驗過時間計算的麻煩與複雜。幸好MariaDB為我們準備了日期時間資料型別,我們用php、Python等支援的程式語言呼叫它取得資料後能無痛透過時間有關的函式庫繼續實作我們自己的程式。就讓我們開始看看MariaDB常見的日期時間資料型別有什麼。

date

資料型別date取值範圍從"1000-01-01"到"9999-12-31",顯示格式為:'yyyy-mm-dd'。

datetime

資料型別datetime取值範圍從"1000-01-01 00:00:00"到"9999-12-31 23:59:59",顯示格式為:'yyyy-mm-dd hh:mm:ss'。

timestamp(m)

值範圍從'1970-01-01 00:00:01' utc到'2038-01-19 03:14:07' utc,顯示格式為:'yyyy-mm-dd hh:mm:ss'。
說到這小弟又要停一下說說timestamp了。timestamp的中文翻譯為時間戳,指的是從1970年1月1日00時00分(臺灣為1970年1月1日08時00分)到目前為止過了多少秒。例如本篇文章貼出日期為2021年8月28日,這一天0時0分的時間戳就是timestamp(1630080000)。

time

time資料型別是專門用來表達時分秒的,值範圍從'-838:59:59'到'838:59:59',顯示格式為:'hh:mm:ss'。不過通常不會有人完全用到它的大部分表達範圍,我們常只會用到從00:00:00到23:59:59之間的值。

year[(2/4)]

資料型別year專門用來表達年,有2位或4位數的差別。我們在定義欄位資料型別時如果省略,預設是4位數。

大物件(LOB)資料型別

最後不得不提一下這個資料型別。我們生活的世代充滿各種影音媒體等的重要、需好好保存的大東西。為了這個需求,資料庫系統也準備了相應的資料型別來幫我們。不過由於小弟並沒有這些資料型別的使用經驗,只知道它們還分成跟作業系統檔案關連與直接存在資料庫內部兩類型。很抱歉下面幾乎就是從書上抄來的了。

tinyblob

最大為255個位元組。

blob(size)

最大為65535位元組。

mediumblob

最大為16777215位元組。

longtext

最大尺寸4GB或4,294,967,295個字元。

能夠看到這邊先給各位拍拍手,趴趴趴趴趴趴。小弟學習資料庫系統近兩年,一直覺得學習資料型別是最煩人最討厭最耗損熱忱的。可是又沒辦法,我們日後在定義表、修改表的時候又不得不用到這些。到這邊先給各位喘口氣,大家先好好的消化消化,有不懂的地方可以在下面留言。板上大神如雲猛牛如雨,必能解答您的問題。基本概念中還剩下的資料庫架構、欄位屬性及基本指令,我們就留到後面再繼續介紹。
※最後更新時間:2021-08-28 09:53:43 From:219.70.166.106 By:Dack
※最後更新時間:2021-08-28 11:54:40 From:219.70.166.106 By:Dack

留言

#1

特種兵

特種兵圖像(預設)

2021-08-29 09:22:46

From:111.249.156.238

NVDA最多用到mediumtext
第四級標題的大物件好像少了 B (BLOB)
blob的最大容量型別是 longblob 才對

#2

Dack

Dack圖像(預設)

2021-08-29 14:28:39

From:118.161.84.17

謝謝郭老師補充

#3

Dack

Dack圖像(預設)

2021-08-29 14:28:54

From:118.161.84.17

不知晚輩有沒有說錯?
大物件資料型別是可以用來存影音圖片檔案等等的東西
實在是沒用過

#4

阿慶

阿慶圖像

2021-08-30 10:05:22

From:211.23.21.202

發現 NVDA 有用到 longtext,在儲存精華區文章內容的欄位上。
下面先給大家嘗嘗鮮,這是用來顯示資料表結構的指令。

MariaDB [nvda_db]> desc refined_posts;
+------------+---------------------+------+-----+---------+----------------+
| Field      | Type                | Null | Key | Default | Extra          |
+------------+---------------------+------+-----+---------+----------------+
| subject    | varchar(255)        | NO   |     | NULL    |                |
| content    | longtext            | NO   |     | NULL    |                |
| class_id   | bigint(20) unsigned | NO   | MUL | NULL    |                |
| id         | bigint(20) unsigned | NO   | PRI | NULL    | auto_increment |
| created_id | bigint(20) unsigned | YES  | MUL | NULL    |                |
| updated_id | bigint(20) unsigned | YES  | MUL | NULL    |                |
| deleted_id | bigint(20) unsigned | YES  | MUL | NULL    |                |
| created_ip | varchar(32)         | NO   |     | NULL    |                |
| updated_ip | varchar(32)         | YES  |     | NULL    |                |
| deleted_ip | varchar(32)         | YES  |     | NULL    |                |
| created_at | timestamp           | YES  |     | NULL    |                |
| updated_at | timestamp           | YES  |     | NULL    |                |
| deleted_at | timestamp           | YES  |     | NULL    |                |
+------------+---------------------+------+-----+---------+----------------+
13 rows in set (0.001 sec)

至於上面有些欄位代表什麼意思,我就先部解釋了,等之後到了相關章節就會遇到。

#5

特種兵

特種兵圖像(預設)

2021-08-30 10:36:51

From:211.23.21.202

物件的部分,沒說錯,只是實務上太大的物件放進去效率很差,通常不推薦使用

#6

Dack

Dack圖像(預設)

2021-08-30 22:41:38

From:219.70.166.106

帥!這個時候就是需要有實務經驗的人來說說法