14、mysql數(shù)據(jù)庫基礎(chǔ)

其中int(0)代表整型,寬度是0位。char(16)定長的字符串,定義的寬度為16位(表示你存儲(chǔ)的字符將占16個(gè)字節(jié))。varchar(16)可變長度字符串,長度是16位(字節(jié))【一個(gè)漢字gbk2個(gè)字節(jié),utf83個(gè)字節(jié)】。datetime保存時(shí)間日期的,text用來存儲(chǔ)字符串類型、大文本數(shù)據(jù)。

一個(gè)非常重要的點(diǎn):mysql數(shù)據(jù)庫的時(shí)候有多種數(shù)字的類型,主要有int,bigint,smallint和tinyint。其中比較迷惑的是int和smallint的差別。今天就在網(wǎng)上仔細(xì)找了找,找到如下內(nèi)容,做個(gè)總結(jié):
使用整數(shù)數(shù)據(jù)的精確數(shù)字?jǐn)?shù)據(jù)類型。
bigint
從 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型數(shù)據(jù)(所有數(shù)字)。存儲(chǔ)大小為 8 個(gè)字節(jié)。
P.S. bigint已經(jīng)有長度了,在mysql建表中的length,只是用于顯示的位數(shù)
int
從 -2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) 的整型數(shù)據(jù)(所有數(shù)字)。存儲(chǔ)大小為 4 個(gè)字節(jié)。int 的 SQL-92 同義字為 integer。
smallint
從 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型數(shù)據(jù)。存儲(chǔ)大小為 2 個(gè)字節(jié)。
tinyint
從 0 到 255 的整型數(shù)據(jù)。存儲(chǔ)大小為 1 字節(jié)。2^8=256,一個(gè)bit記錄正負(fù)、
注釋
在支持整數(shù)值的地方支持 bigint 數(shù)據(jù)類型。但是,bigint 用于某些特殊的情況,當(dāng)整數(shù)值超過 int 數(shù)據(jù)類型支持的范圍時(shí),就可以采用 bigint。在 SQL Server 中,int 數(shù)據(jù)類型是主要的整數(shù)數(shù)據(jù)類型。
在數(shù)據(jù)類型優(yōu)先次序表中,bigint 位于 smallint 和 int 之間。
只有當(dāng)參數(shù)表達(dá)式是 bigint 數(shù)據(jù)類型時(shí),函數(shù)才返回 bigint。SQL Server 不會(huì)自動(dòng)將其它整數(shù)數(shù)據(jù)類型(tinyint、smallint 和 int)提升為 bigint。
int(M) 在 integer 數(shù)據(jù)類型中,M 表示最大顯示寬度。在 int(M) 中,M 的值跟 int(M) 所占多少存儲(chǔ)空間并無任何關(guān)系。和數(shù)字位數(shù)也無關(guān)系 int(3)、int(4)、int(8) 在磁盤上都是占用 4 btyes 的存儲(chǔ)空間。

比如存int(3),可以存數(shù)值1234,"3"只是代表例如存12這個(gè)數(shù)值,如果指定了屬性zerofill,代表‘0’填充,就是MySQL數(shù)據(jù)庫會(huì)自動(dòng)做0的填充,填到前面來,又因?yàn)橹付ǖ氖恰?”位,所以填充一個(gè)0。int(n),只是保證存儲(chǔ)值的最小寬度是n位。通常情況下,不指定zerofill “n”是沒有任何意義的。可以在phpmyadmin或navicat中手動(dòng)設(shè)置,或alter table t1 modify id1 int zerofill;

對(duì)于decimal來說,它里面存儲(chǔ)小數(shù)點(diǎn)的時(shí)候,無論小數(shù)后幾位都可以保存下來,而float和double是有取值范圍的。對(duì)于計(jì)算來說,float和double的計(jì)算效率會(huì)更高一些,decimal可以理解成當(dāng)成字符串來處理的,所以它存儲(chǔ)的內(nèi)容會(huì)更大。

比如指定的是varchar(16)而存的是varchar(32),會(huì)導(dǎo)致這個(gè)32位的字符串被截成16位。有的mysql版本也可能會(huì)直接報(bào)錯(cuò)。

比如定義char(5),存一個(gè)三位的字符串,則會(huì)補(bǔ)兩個(gè)空格。
存儲(chǔ)密碼的時(shí)候可以用char,如char(32),因?yàn)镸D5
之后,無論多長的字符串都會(huì)變成32位。
注意一下,varchar可變長指的是只會(huì)往小的縮,而不會(huì)往大擴(kuò)。char和varchar一旦超出預(yù)設(shè)值,都會(huì)截?cái)唷?/p>

BLOB是一個(gè)二進(jìn)制大對(duì)象

定義一個(gè)性別,就可以用enum,ENUM("男", "女"),特點(diǎn)是值非常緊湊,把列表值壓縮成1或2個(gè)字節(jié)。其內(nèi)部存儲(chǔ)的是整數(shù),在這里其內(nèi)部是ENUM("0", "1")這樣來存儲(chǔ)。

TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,并且格式為YYYY-MM-DD HH:MM:SS。
范圍不同:datetime 以''YYYY-MM-DD HH:MM:SS''格式檢索和顯示DATETIME值。支持的范圍為''1000-01-01 00:00:00''到''9999-12-31 23:59:59''TIMESTAMP值不能早于1970或晚于2037
關(guān)于存儲(chǔ)微秒,可以考慮使用bigint:小數(shù)有很多位,用float和double可能會(huì)有損耗,可以把值乘以多少位例如100000,存進(jìn)數(shù)據(jù)庫,拿出來再除就行了。

-u用戶名,-p密碼,-h主機(jī),-P端口
\G把打印的結(jié)果垂直顯示格式化處理、\c取消當(dāng)前MySQL的命令、\q退出mysql、\s顯示MySQL的服務(wù)器狀態(tài)、\h幫助信息、\d改變執(zhí)行符,例如把分號(hào);改成其他符號(hào)

總體來說innodb有優(yōu)勢(shì),雖然myisam支持一些innodB不具備的,例如有全文索引、但mysiam的全文索引僅僅支持英文,所以實(shí)際很少去用。一般使用到用斯芬克斯,ES、盧森等等。

今天對(duì)比一下mysql兩種常用存儲(chǔ)引擎myisam和innodb的文件存儲(chǔ)結(jié)構(gòu):
先說一下兩者的大概區(qū)別:
myisam 更適合讀取大于寫入的業(yè)務(wù),同時(shí)不支持事物。
innodb 支持事物,效率上比myisam稍慢。
文件存儲(chǔ):
myism物理文件結(jié)構(gòu)為:
.frm文件:與表相關(guān)的元數(shù)據(jù)信息都存放在frm文件,包括表結(jié)構(gòu)的定義信息等。
.myd文件:myisam存儲(chǔ)引擎專用,用于存儲(chǔ)myisam表的數(shù)據(jù)
.myi文件:myisam存儲(chǔ)引擎專用,用于存儲(chǔ)myisam表的索引相關(guān)信息
innodb的物理文件結(jié)構(gòu)為:
.frm與表相關(guān)的元數(shù)據(jù)信息都存放在frm文件,包括表結(jié)構(gòu)的定義信息等。
.ibd文件和.ibdata文件:
這兩種文件都是存放innodb數(shù)據(jù)的文件,之所以用兩種文件來存放innodb的數(shù)據(jù),是因?yàn)閕nnodb的數(shù)據(jù)存儲(chǔ)方式能夠通過配置來決定是使用共享表空間存放存儲(chǔ)數(shù)據(jù),還是用獨(dú)享表空間存放存儲(chǔ)數(shù)據(jù)。
獨(dú)享表空間存儲(chǔ)方式使用.ibd文件,并且每個(gè)表一個(gè)ibd文件
共享表空間存儲(chǔ)方式使用.ibdata文件,所有表共同使用一個(gè)ibdata文件
覺得使用哪種方式的參數(shù)在mysql的配置文件中 innodb_file_per_table

對(duì)于myisam的表鎖,如果有人正在操作這張表,這張表就會(huì)被鎖定,下一個(gè)人過來訪問的時(shí)候如果他操作還未結(jié)束,讀的時(shí)候會(huì)有問題,讀不出來,或者等待。

所以在做事務(wù)處理的時(shí)候一定要檢查表的引擎,確保是innodb。

比如在使用事務(wù)或者一個(gè)復(fù)雜操作的時(shí)候,可能會(huì)很多條的sql語句操作,這個(gè)時(shí)候就可以把它封裝起來,別人想用的時(shí)候直接拿過來使用,不用再寫那么多條sql語句了。所以可以放到存儲(chǔ)過程里面。

實(shí)現(xiàn)改一張表就會(huì)自動(dòng)更改另外一張表,可以使用觸發(fā)器操作,
添加一條數(shù)據(jù)自動(dòng)生成一個(gè)業(yè)務(wù)編號(hào),但是寫的太多就會(huì)導(dǎo)致不清楚執(zhí)行一條sql語句,另一條就自動(dòng)執(zhí)行了。不好管理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MySQL數(shù)據(jù)庫對(duì)象與應(yīng)用 2.1-MySQL數(shù)據(jù)類型 庫建立好之后基本不動(dòng),和我們接觸最頻繁的是表. 建表就是聲...
    極客圈閱讀 2,258評(píng)論 0 8
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序。每個(gè)數(shù)據(jù)庫具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建,訪問,管理...
    chen_000閱讀 4,143評(píng)論 0 19
  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口閱讀 16,131評(píng)論 0 16
  • MySQL5.6從零開始學(xué) 第一章 初始mysql 1.1數(shù)據(jù)庫基礎(chǔ) 數(shù)據(jù)庫是由一批數(shù)據(jù)構(gòu)成的有序的集合,這些數(shù)據(jù)...
    星期四晚八點(diǎn)閱讀 1,232評(píng)論 0 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,706評(píng)論 18 399

友情鏈接更多精彩內(nèi)容