MySQL神功2.5 數(shù)據(jù)類型的細(xì)分之二進制類型
一、什么是母語
意思是每個人的本民族語言;嬰兒期和幼年期間自然學(xué)到的語言;一個人的第一語言。
例如小學(xué)生6歲左右上一年級,但是在他們上學(xué)前,就算你什么都沒有教,他們聽大人說話也會學(xué)會母語的發(fā)音與人正常交流。
二、計算機的母語是二進制代碼
機器語言程序是用機器指令(二進制代碼表示)編寫的,計算機能夠直接識別和執(zhí)行,所以說計算機的"母語"是二進制代碼。
例如:十進制的數(shù)字105,轉(zhuǎn)換成二進制數(shù)字是1101001

你可能認(rèn)為,這不是把三位數(shù)變成了7位數(shù)嗎?那你學(xué)英語時,keep pace with the times 翻譯成中文:與時俱進? ? 你咋不說英文變長了?
1、十進制轉(zhuǎn)二進制方法
十進制數(shù)轉(zhuǎn)換為二進制數(shù)時,由于整數(shù)和小數(shù)的轉(zhuǎn)換方法不同,所以先將十進制數(shù)的整數(shù)部分和小數(shù)部分分別轉(zhuǎn)換后,再加以合并。
(1)十進制整數(shù)轉(zhuǎn)二進制
以十進制數(shù)字105為例,轉(zhuǎn)二進制方法

其實就是將一個整數(shù),一直除以2,取余數(shù),直到商為零時結(jié)束。最后將余數(shù)從下向上順序排列:1101001
(2)十進制小數(shù)轉(zhuǎn)二進制
這次我們找個簡單的,以0.25為例,轉(zhuǎn)成二進制是:.01

對十進制小數(shù)連續(xù)乘以2(每次只乘以積的小數(shù)部分),取整數(shù)部分,直到積的小數(shù)部分顯示零為止。最后將整數(shù)位從上向下排列。
但是,大家可能對上面藍色字不理解,我們再舉個例子:十進制小數(shù)0.3怎么轉(zhuǎn)換

2、二進制轉(zhuǎn)十進制方法
剛才我們知道十進制數(shù)字105的二進制數(shù)字是1101001
現(xiàn)在我們講一下如何把二進制數(shù)字轉(zhuǎn)成十進制數(shù)字,方法:

如果有小數(shù)部分,那就整數(shù)轉(zhuǎn)整數(shù),小數(shù)轉(zhuǎn)小數(shù)。整數(shù)我們學(xué)會了,就是從左向右

那你們想過沒有?為什么整數(shù)都是從右向左,而小數(shù)是從左向右。
這個問題有小學(xué)四年級的基礎(chǔ)即可理解,此處略過。

以上知識,略懂即可,也不會讓你人工去轉(zhuǎn)換的。
三、BIT類型(位字段類型)
BIT(M)? ? 存儲: 約等于(M+7)/ 8 字節(jié)? ? 存儲M個二進制位的值
其中M(最大長度)的范圍是1~64,當(dāng)省略M時,默認(rèn)為1。
這個類型我們沒有必要去研究他的存儲空間,因為只有需要的時候才會用。
(1)應(yīng)用1:布爾類型(邏輯型)
因為MySQL中沒有 BOOLEAN類型(SQL Server中有)
我們通常是使用整數(shù)類型中的 TINYINT(1) 來表示 True?= 1? ?、False = 0
但是,你考慮過一個問題嗎?使用TINYINT(1) 可以輸入 0~9
我們先創(chuàng)建一張表

在表中輸入內(nèi)容,當(dāng)字段【是否隊員】為0時,表示非隊員,否則是隊員

但是我在查詢的時候,會出錯。因為在MySQL中
True=1,F(xiàn)alse=0
True屬于非0 ,F(xiàn)alse屬于0
因為您寫? 是否隊員=TRUE? ?這里的TRUE是一個常量? 永恒=1

解決方法,寫成 is TRUE

關(guān)于為什么會這樣,網(wǎng)上有很多專業(yè)的解釋,因為我的文化程度是幼兒園畢業(yè),所以我只能用我的語言來解釋。等號后面一次只能是一個值
因為你這不是變量,也不是循環(huán)
True屬于非0的值,但是 True =1? (這是概念)
當(dāng)你使用 is TRUE 時,表示屬于True的值,那除了0都是True
孫興華 = 青銅圣斗士
孫興華 = 男
孫興華 = 孫藝航的小弟
孫興華 is (屬于)青銅圣斗士、男、孫藝航的小弟
類似的問題你以后還會遇到null,因為null不是一個值,所以不能寫 孫興華=null? 要寫? 孫興華 is null

那如果我們使用bit類型呢?

因為bit類型是二進制的,只能輸入0或1,你輸入2、3...也會被強制改回1

在查詢時寫成? 是否團員=TRUE? 就沒問題了

你寫成? 是否團員 is TRUE? 同樣沒有問題,是不是減少錯誤的發(fā)生率?

(2)應(yīng)用2:做標(biāo)記
我先舉一個例子,北宋時期包拯在開封府判了張三,后來發(fā)現(xiàn)不對,但是這時只能撤銷不能刪除。希望你們可以明白我的意思,有些東西是不能刪除的??赡苣愕墓ぷ髦袥]遇到。

(3)應(yīng)用3:表示狀態(tài)
去年我發(fā)了一篇文章:https://www.bilibili.com/read/cv18587006
關(guān)于RFM模型分析


在我的那篇文章中,只需要考慮RFM三個狀態(tài),所以我們可以使用BIT(3)這個類型
假設(shè)你有一個項目,需要各部門審批,01101010? 可以使用BIT(8) 表示8個部門,其中0代表未審批,1代表已審批。
假設(shè)BIT(4)? ,你只輸入1 ,會顯示0001;你輸入11,會顯示0011;你輸入111,會顯示0111。不用關(guān)心存儲空間,還是去關(guān)心一下自己的使用場景吧。
四、BINARY(M)與VARBINARY(M)
BINARY 和 VARBINARY 類似于 CHAR 和 VARCHAR,存儲的是二進制字節(jié)串而不是字符串,這意味著它沒有字符集校驗的概念,排序和比較都是基于字節(jié)中的實際數(shù)值大小進行的。
理論上講二進制是計算機“母語”,讀取應(yīng)該快,但是實際速度測試中BINARY 和 VARBINARY的確快于CHAR 和 VARCHAR,只是區(qū)別不明顯,例如跑1000米,你跑3分37秒,我跑3分38秒。

我個人一般情況下是不會把數(shù)據(jù)存成這兩個類型的
原因一:我看不懂呀:)
比如我給你一串二進制數(shù),你能看出下面這串?dāng)?shù)字代表:哈羅雷球白夕尚? ?嗎?
11100101 10010011 10001000 11100111 10111101 10010111 11101001 10011011 10110111 11100111 10010000 10000011 11100111 10011001 10111101 11100101 10100100 10010101 11100101 10110000 10011010
我們使用網(wǎng)上的翻譯器就能翻譯出來

原因二:高風(fēng)險
實際應(yīng)用的時候 varbinary 存儲單位的改變給開發(fā)帶來更多的迷惑性,尤其是使用 varbinary 存儲漢字時,開發(fā)需要更多的考慮具體設(shè)計多長才能滿足業(yè)務(wù)需求,存在被截斷的風(fēng)險。
那有什么用處呢?
上文我們提到,因為binary和varbinary存儲的是二進制字節(jié)串而不是字符串,這意味著它沒有字符集校驗的概念,排序和比較都是基于字節(jié)中的實際數(shù)值大小進行的。而char和varchar類型存儲的列在比較的時候是通過字符集的方式進行的,例如:"English"和"ENGLISH"是一致的。
我們新建一張表,使用varchar和char類型建立兩個字段

輸入數(shù)據(jù)

使用查詢:它是不區(qū)分大小寫的


那怎么處理呢?

MySQL可以在SQL語句中加入 binary來區(qū)分大小寫。這里的binary不是函數(shù),是類型轉(zhuǎn)換運算符,它用來強制它后面的字符串為一個二進制字符串,來彌補非二進制字符串類型不區(qū)分大小寫的問題。
看到這里,小伙伴都應(yīng)該明白一個道理,原因和語法不能一起講(這就是為什么市面上會有不同知識層次的書籍),我在3年前講的MySQL基礎(chǔ)篇?
https://www.bilibili.com/video/BV1Dk4y1d71j
現(xiàn)在講原理,沒有基礎(chǔ)語法的知識積累,你能看懂?SELECT * FROM 測試表1 where? v="A" 這句話的意思嗎?如果沒看懂,那談什么原理?
五、BLOB類型

BLOB與我們上節(jié)課講的TEXT的四種類型類似,區(qū)別在于:
BLOB:二進制字符串、可以保存照片、音樂、視頻、文件等、沒有字符集
TEXT:非二進制字符串、只可以存純文本、有字符集
但是,我個人一般是不會用這個類型的,圖片、視頻、音頻、文件等,通常情況下是不會直接存到數(shù)據(jù)庫中的,而是保存到文件夾下,在數(shù)據(jù)庫中存放一個路徑。我們在學(xué)Access中就會發(fā)現(xiàn),你在一個數(shù)據(jù)庫中附件存上1GB的視頻,哪怕這個庫中只有一個表,一行記錄,你打開都會很慢,但是你把視頻放在文件夾里,在表中做個鏈接不是更好嗎?
謹(jǐn)記:數(shù)據(jù)庫容量越小越好,否則你就要配更高級的電腦;如果數(shù)據(jù)庫不合理,可能需要N年以后的電腦來使用了。就好比我們玩《霍格沃茲遺產(chǎn)》PC端16G內(nèi)存不夠、8G顯存不夠...買了新電腦玩不爽,又回到PS5主機上面玩去了。這就是優(yōu)化問題。

MySQL神功文字版合集:https://www.bilibili.com/read/readlist/rl581425