MySQL資料庫基礎詳解

来源:https://www.cnblogs.com/WUXIAOCHANG/archive/2019/05/18/10885361.html
-Advertisement-
Play Games

文章大綱 一、資料庫簡介二、Mysql資料庫簡介三、Mysql安裝與服務啟動(Windows版本)四、Mysql圖形化工具五、Mysql存儲引擎精講六、Mysql數據類型介紹七、Mysql主要專業名稱介紹八、Mysql常見sql語句九、Mysql設計與語句優化十、事務介紹十一、Mysql資料庫備份與 ...


文章大綱

一、資料庫簡介
二、Mysql資料庫簡介
三、Mysql安裝與服務啟動(Windows版本)
四、Mysql圖形化工具
五、Mysql存儲引擎精講
六、Mysql數據類型介紹
七、Mysql主要專業名稱介紹
八、Mysql常見sql語句
九、Mysql設計與語句優化
十、事務介紹
十一、Mysql資料庫備份與恢復
十二、Mysql分庫分表
十三、Mysql許可權管理
十四、Mysql資料庫之阿裡雲
十五、資料下載
十六、參考文章

 

一、資料庫簡介

1. 資料庫是什麼

  資料庫是數據管理的有效技術,是由一批數據構成的有序集合,這些數據被存放在結構化的數據表裡。數據表之間相互關聯,反映客觀事物間的本質聯繫。資料庫能有效地幫助一個組織或企業科學地管理各類信息資源。
  數據是資料庫中存儲的基本對象,是按一定順序排列組合的物理符號。數據有多種表現形式,可以是數字、文字、圖像,甚至是音頻或視頻,它們都可以經過數字化後存入電腦。
  資料庫是數據的集合,具有統一的結構形式並存放於統一的存儲介質內,是多種應用數據的集成,並可被各個應用程式所共用。
  在日常生活中,人們可以直接用中文、英文等自然語言描述客觀事物。在電腦中,則要抽象出對這些事物感興趣的特征,並組成一個記錄來描述。

2. 資料庫在開發中的作用

  從資料庫系統應用角度來看,資料庫系統常見的運行與應用結構有:客戶端/伺服器結構、瀏覽器/伺服器結構。
  在客戶端/伺服器(Client/Server,C/S)結構中,資料庫的使用者(如 DBA、程式設計者)通過命令行客戶端、圖形化界面管理工具或應用程式等連接到資料庫管理系統,可以通過資料庫管理系統查詢和處理存儲在底層資料庫中的各種數據。
  資料庫使用者與命令行客戶端、圖形化界面管理工具或應用程式等直接交互,而不與資料庫管理系統直接聯繫。
  在這種結構中,命令行客戶端、圖形化界面管理工具或應用程式等稱為“客戶端”或“前臺”,主要完成與資料庫使用者的交互任務;而資料庫管理系統則稱為“伺服器”或“後臺”,主要負責數據管理。這種結構經常被稱為“C/S”結構。
  在客戶端/伺服器模式中,客戶端和伺服器可以同時工作在同一臺電腦上,這種工作方式稱為“單機方式”;也可以“網路方式”運行,即伺服器被安裝和部署在網路中某一臺或多台主機上。
  對於客戶端應用程式的開發,目前常用的語言工具主要有 Visual C++、Delphi、.NET 框架、Visual Basic、Python 等。
  資料庫能有效存儲數據,讀取數據、查找數據更是方便,其實那些管理軟體就是通過軟體的界面向內部的資料庫進行數據的增、刪、改、查操作。

3.常見資料庫比較

3.1 MySQL資料庫
定位
開源、多平臺、關係型資料庫
目前使用最廣泛、流行度最高的的開源資料庫。

功能
支持事務,符合關係型資料庫原理,符合ACID,支持多數SQL規範,以二維表方式組織數據,有插件式存儲引擎,支持多種存儲引擎格式

部署
用編譯安裝的方式,或者二進位包的方式,按照“安裝軟體-創建實例-庫表用戶初始化”,可以很快完成資料庫部署

使用
使用標準的SQL語句進行資料庫管理,簡單SQL語句的併發和性能較好,對視圖、存儲過程、函數、觸發器等支持的不是太好

監控
在命令行界面有一些常用的命令顯示狀態和性能,在圖形界面方面,有比較多的開源監控工具來監控和記錄資料庫的狀態,比如zabbix,nagios,cacti,lepus等

備份
邏輯備份 mysqldump/mysqldumper ,物理備份 用xtrabackup等工具進行備份;

高可用
MySQL高可用有多種方案,官方有基礎的master-slave主從複製,新版本的innodb cluster,第三方的有MHA等高可用方案;

擴展
MySQL水平拆分,可以通過水平拆分proxy中間進行邏輯映射和拆分,擴大MySQL資料庫的併發能力和吞吐量。

適用場景
預設的innodb存儲引擎,支持高併發,簡單的絕大部分OLTP場景;
Tokudb存儲引擎,使用高併發insert的場景;
Inforbright存儲引擎,可以進行列壓縮和OLAP統計查詢場景;

選擇註意
使用MySQL進行OLTP業務時,需要註意數據量級,如果數據量級過大,需要進行水平拆分;
如果有OLAP需求,可以結合其他架構綜合考慮。

3.2 SQL Server資料庫
定位
商業、Windows平臺、關係型資料庫
最早接觸、與微軟體繫結合緊密的的商業資料庫,屬於“微軟技術體系”

功能
支持事務,符合關係型資料庫原理,符合ACID,支持多數SQL規範,以二維表方式組織數據

部署
在Windows平臺,用圖形界面進行軟體安裝;

使用
在Windows平臺,使用SQL Server Mangement Studio圖形界面進行安裝;

監控
一般通過Windows資源管理和SQL server圖形工具進行系統和資料庫性能顯示;

備份
通常用第三方備份恢復軟體進行備份恢復;

高可用
通過共用存儲和雙機熱備的方式,可以實現SQL Server資料庫的高可用;

擴展
SQL Server資料庫集群採用共存存儲的方式,通過硬體垂直升級來對資料庫集群進行擴展;

適用場景
大多數OLTP場景(與微軟體系配合)

選擇註意
SQL Server與微軟技術體繫結合比較緊密,絕大多數工作,都是通過圖形界面完成,對於習慣使用命令行的DBA可能會有不習慣;
SQL server對雙引號,大小寫,元信息的管理和處理方式,與其他資料庫很不相同,需要註意;
使用SQL Server滿足OLTP業務,會有比較好的效果,但對於大數據量的OLAP業務,最好還是選用專門的OLAP架構,不要在同一個SQL Server實例上混用OLTP和OLAP業務;
SQL server屬於商業軟體,需要註意版權和licence授權費用;

3.3 Oracle資料庫
定位
商業、多平臺、關係型資料庫
功能最強大、最複雜、市場占比最高的商業資料庫

功能
支持事務,符合關係型資料庫原理,符合ACID,支持多數SQL規範,以二維表方式組織數據

部署
Oracle單實例資料庫部署相對容易,但Oracle RAC集群環境,部署的步驟和依賴條件都比較多;

使用
通常使用命令行工具,進行各種資料庫的管理,通常也可以用shell腳本和python腳本提高Oracle資料庫管理效率;各種管理功能,都比較強大;

監控
Oracle官方有比較全面的監控工具,常用的第三方監控平臺,如zabbix,cacti,lepus等都有對Oracle資料庫的各項指標的完善監控;

備份
支持冷備份和熱備份,可以用 exp/imp , expdp/impdp等進行邏輯備份和恢復,可以使用強大的RMAN工具進行專業的物理熱備份和恢復;

高可用
Oracle資料庫的高可用架構,可以用第三方雙機熱備軟體,結合Oracle單實例實現;可以使用Oracle Dataguard,實現master和standby的備份;可以使用 Oracle RAC集群實現實例級別的高可用和負載均衡,使用ASM實現存儲級別的高可用;

擴展
由於Oracle集群採用共用存儲的方式,一般只能通過垂直硬體升級進行升級;

適用場景
絕大多數OLTP場景,部分OLAP

選擇註意
Oracle從架構到運維,可以說是最難的資料庫,學習和使用難度較高。

3.4 Hbase資料庫
定位
開源、Linux平臺、列存儲nosql資料庫
可用於海量數據存儲、與Hadoop生態圈結合、定位於“大”的列存儲nosql資料庫

功能
命令執行速度非常看,讀寫性能可達10萬/秒;數據結構是key-value類似字典的功能,可以鍵過期-緩存,發佈訂閱-消息系統,簡單的事物功能;

部署
相對其他資料庫,hbase的部署比較複雜,依賴Hadoop,zookeeper等組件,Hbase集群包括一個mater節點,多個regionServer,zookeeper管理所有regionServer,需要依次部署Hadoop、zookeeper之後,再部署HBASE集群;

使用
用redis-cli客戶端連接,一般用簡單的 set ,get,del 進行數據管理; 在單實例redis的基礎上,進行可以數據持久化,主從複製,高可用和分散式等功能;

監控
在命令行界面有一些常用的命令顯示狀態和性能,在圖形界面方面,有開源監控工具來監控和記錄資料庫的狀態,比如cachecloud;

備份
Hbase一般用作海量數據的倉庫,本身通過多層副本來保證數據安全性,不用進行專門的備份

高可用
HBASE集群基於Hadoop,需要依次部署Hadoop單機模式、集群模式、HA模式,通過Hadoop HA實現高可用;

擴展
HBASE以集群形式,依次是單機模式,偽分佈模式,完全分佈模式,底層基於HDFS,zookeeper可以很好地進行擴展;

適用場景
兩大用途:
用於簡單數據寫入和海量、結構簡單數據查詢的業務場景;
用於成為其他資料庫備份和下沉的資料庫;

選擇註意
Hbase不適合的場景:對數據分析需求高,需要能夠用sql或者簡單的MapReduce實現分析需求的業務場景,不適合用Hbase;
單表數據量,不超過千萬時,使用Hbase,體現不出Hbase的優勢,而且會比較慢,不適合用Hbase。
通過對上面資料庫“七種”武器的描述,也可以看到目前常用資料庫的使用脈絡和選擇順序,對應一個業務,可以優先選擇最流行的開源資料庫——MySQL;如果出於穩定和商業版考慮,可以選擇Oracle資料庫,或者SQL Server資料庫(與Windows體繫結合);如果想用開源,有想要有足夠的功能來應對各種場景,可以使用 postgresql資料庫。這四種資料庫,都是關係型資料庫,可以很好地滿足大多數業務場景,解決通用性問題。
對於一些特殊性問題,尤其是想要在擴展性方面有比較高的要求,可以考慮nosql資料庫。Mongodb資料庫,介於關係型資料庫和非關係型資料庫之間,兼具兩者的特點,是非常流行的文檔型nosql資料庫;redis定位於記憶體型鍵值nosql資料庫;hbase是海量文件存儲的列式nosql資料庫。根據合適的業務場景,選擇適合的nosql資料庫,可以對某一類,或某幾類業務問題有很好的解決,可以作為關係型資料庫的一種補充。
換個角度,MySQL,Oracle,SQL Server,Postgresql,mongodb這五種資料庫,也是DB-Engines排行榜上最流行的排名前五的五種資料庫,從使用量和受歡迎程度,也可以看出這些資料庫使用的廣泛性。

4. 資料庫常見功能

 

二、Mysql資料庫簡介

1. MySQL的優勢

  MySQL 使用的 SQL 語言是用於訪問資料庫的最常用的標準化語言。
  由於 MySQL 資料庫體積小、速度快、總體擁有成本低、開放源代碼,其有著廣泛的應用,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。由於其社區版的性能卓越,因此搭配 PHP 和 Apache 伺服器可組成良好的開發環境。
  MySQL 資料庫管理系統具有以下系統特性:
(1) 使用 C 和 C++ 編寫,並使用多種編譯器進行測試,保證源代碼的可移植性。
(2)支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows 等多種操作系統。
(3)為多種編程語言提供了 API。這些編程語言包括 C、C++、PythonJava、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
(4)支持多線程,充分利用 CPU 資源。
(5)優化的 SQL 查詢演算法,有效地提高查詢速度。
(6)既能夠作為一個單獨的應用程式應用在客戶端伺服器網路環境中,也能夠作為一個庫而嵌入其他的軟體中。
(7)提供多語言支持,常見的編碼如中文的 GB 2312、BIG 5,日文的 Shift_JIS 等都可以用作數據表名和數據列名。
(8)提供 TCP/IP、ODBC 和 JDBC 等多種資料庫連接途徑。
(9)提供用於管理、檢查、優化資料庫操作的管理工具。
(10)支持大型的資料庫。可以處理擁有上千萬條記錄的大型資料庫。
(11)支持多種存儲引擎。

2. MySQL的版本以及版本號

針對不同的用戶,MySQL 分為兩個版本:
(1)MySQL Community Server(社區版):該版本完全免費,但是官方不提供技術支持。
(2)MySQL Enterprise Server(企業版):該版本能夠以很高的性價比為企業提供數據倉庫應用,支持 ACID 事物處理,提供完整的提交、回滾、崩潰恢復和行級鎖定功能,但是該版本需要付費使用,官方提供電話技術支持。
溫馨提示:MySQL Cluster 主要用於架設群伺服器,需要在社區服務或企業版的基礎上使用。

MySQL 的命名機制由 3 個數字和 1 個尾碼組成,例如 mysql-5.7.20:
第 1 個數字“5”是主版本號,用於描述文件的格式,所有版本 5 的發行版都有相同的文件夾格式。
第 2 個數字“7”是發行級別,主版本號和發行級別組合在一起便構成了發行序列號。
第 3 個數字“20”是在此發行系列的版本號,隨每次新發行的版本遞增。通常選擇已經發行的最新版本。

在 MySQL 開發過程中,同時存在多個發佈系列,每個發佈系列的成熟度處在不同階段。
MySQL 5.7 是最新開發的穩定(GA)發佈系列,是將執行新功能的系列,目前已經可以正常使用。
MySQL 5.6 是比較穩定的(GA)發佈系列,只針對漏洞修複重新發佈,不增加會影響穩定性的新功能。
MySQL 5.1 是一個穩定的(產品質量)發佈系列,只針對嚴重漏洞修複和安全修複重新發佈,不增加影響該系列穩定性的重要功能。
對於 MySQL 4.1 等低於 5.0 的老版本,官方將不再提供支持

3. MySQL 5.7的新特性

與 MySQL 5.6 相比,MySQL 5.7 具有以下幾個方面的新功能。
(1)隨機 root 密碼
MySQL 5.7 資料庫初始化完成後,會自動生成一個 root@localhost 用戶,root 用戶的密碼不為空,而是隨機產生一個密碼。
(2)自定義 test 資料庫
MySQL 5.7 預設安裝完成後沒有 test 資料庫。用戶可以自行創建 test 資料庫並對其進行許可權控制。
(3)預設 SSL 加密
MySQL 5.7 採用了更加簡單的 SSL 安全訪問機制,預設連接使用 SSL 的加密方式。
(4)密碼過期策略
MySQL 5.7 支持用戶設置密碼過期策略,要求用戶在一定時間過後必須修改密碼。
(5)用戶鎖
MySQL 5.7 為管理員提供了暫時禁用某個用戶的功能,使被鎖定的用戶無法訪問和使用資料庫。
(6)全面支持JSON
MySQL 5.7在伺服器端提供了一組便於操作 JSON 的函數。存儲的方法是將 JSON 編碼成 BLOB 後再由存儲引擎進行處理。這樣,MySQL 就同時擁有了關係型資料庫和非關係型資料庫的優點,並且可以提供完整的事務支持。
(7)支持兩類生成列(generated column)
生成列是通過資料庫中的其他列計算得到的一列。當為生成列創建索引時,可以便捷地加快查詢速度。MySQL 5.7 支持虛擬生成列和存儲生成列。虛擬生成列僅將數據保存在表的元數據中,作為預設的生成列類型;存儲生成列則是將數據永久保存在磁碟上,需要更多的磁碟空間。
(8)引入系統庫(sys schema)
系統庫中包含一系列視圖、函數和存儲過程,通過多線程、多進程、組合事務提交和基於行的優化方式將複製功能提高 5 倍以上,用戶向外擴充其跨商品系統的工作負載時,得以大幅提升複製的效能和效率。
與 MySQL 5.6 相比,MySQL 5.7 具有以下幾個方面的新功能。

三、Mysql安裝與服務啟動(Windows版本)

1. 下載

用戶可以根據自身的操作系統類型,從 MySQL 官方下載頁面免費下載相應的伺服器安裝包。本書以 MySQL 5.7.20 為例介紹其在 Windows 10 操作系統下的安裝和配置過程。

用戶下載 Windows 圖形化安裝包的步驟如下。

步驟 1):打開 MySQL 官方網站(http://www.mysql.com),單擊 DOWNLOAD,進入 MySQL 產品的下載界面,如圖所示。

 

步驟 2):在 MySQL 產品分類中選擇 Community 菜單,在下載列表中選擇 MySQL Community Server,如圖所示。

 

步驟3):在下載頁面中,操作系統選擇 Microsoft Windows,下載的安裝文件為 mysql-installer-community-5.7.20.0.msi,如圖所示。

 

2. 安裝教程

Windows 平臺下提供兩種安裝 MySQL 的方式:

  • MySQL 二進位分發版(.msi 安裝文件)。
  • 免安裝版(.zip 壓縮文件)。

用戶使用圖形化安裝包安裝 MySQL 的步驟如下:

步驟 1):雙擊下載的 MySQL 安裝文件,進入 MySQL 安裝界面,首先進入“License Agreement(用戶許可證協議)”視窗,選中“I accept the license terms(我接受系統協議)”覆選框,單擊“Next(下一步)”按鈕,如圖所示。

  進入MySQL安裝界面並接受系統協議

步驟 2):進入“Choosing a Setup Type(安裝類型選擇)”視窗,根據右側的安裝類型描述文件選擇適合自己的安裝類型,這裡選擇預設的安裝類型,如圖所示。

  選擇預設的安裝類型

註意:Developer Default:預設安裝類型;Server only:僅作為服務;Client only:僅作為客戶端;Full:完全安裝;Custom:自定義安裝類型。

步驟 3):根據所選擇的安裝類型安裝 Windows 系統框架(framework),單擊 Execute 按鈕,安裝程式會自動完成框架的安裝,如圖所示。

  檢查並生成安裝所需要的框架列表

當彈出安裝程式視窗時,勾選“我同意許可條款和條件”覆選框,然後單擊“安裝”按鈕,如圖所示。

  同意安裝框架的許可條件

彈出“設置成功”的界面,表示該框架已經安裝完成,單擊“關閉”按鈕即可。所有的框架安裝均可參考本操作,如圖所示。

  安裝框架成功

步驟 4):所需框架均安裝成功後,單擊 “Next(下一步)”按鈕,如圖所示。

  所有框架安裝完成

步驟 5):進入安裝確認視窗,單擊 “Execute(執行)”按鈕,開始 MySQL 各個組件的安裝,如圖所示。

  準備安裝MySQL各個組件

步驟 6):開始安裝 MySQL 文件,安裝完成後在 “Status(狀態)”列表下顯示 “Complete(安裝成功)”,如圖所示。

  MySQL各個組件安裝成功

3. 判斷是否安裝成功

3.1 啟動與關閉服務
net start mysql為啟動服務,net stop mysql為關閉命令

 

3.2 登錄資料庫
cmd進入資料庫的bin文件夾中

 

輸入mysql -u root -p命令,再輸入登錄密碼,出現以下結果代表登錄成功

 

3.3 查看資料庫名稱
登錄完成後,輸入show databases

 

四、Mysql圖形化工具

(1)Navicat(重點推薦)

 

Navicat是MySQL和MariaDB資料庫管理與開發理想的解決方案。它可同時在一個應用程式上連接MySQL和MariaDB資料庫。這種相容前端為資料庫提供了一個直觀而強大的圖形界面管理、開發和維護功能,為初級MySQL和MariaDB開發人員和專業開發人員都提供了一組全面的開發工具。

(2)Induction

 

Induction是一款用於理解數據關係的開源管理工具,它可用來探索行/列,運行查詢和數據可視化等方面。該工具支持多種資料庫,包括PostgreSQL,MySQL,SQLite,Redis以及MongoDB。此外,Induction還可以通過編寫添加其他新的適配器。

(3)SqlWave

 

SQLWave是一種簡單、快速且易用的MySQL客戶端。用戶可通過該工具輕鬆地連接到遠程主機。SqlWave支持所有MySQL的最新版本,包括它用來管理資料庫結構的所有最新功能,如工作表、視圖、存儲過程、函數、事件、外鍵和觸發器等。

五、Mysql存儲引擎精講

1. 存儲引擎分類

  資料庫存儲引擎是資料庫底層軟體組件,資料庫管理系統使用數據引擎進行創建、查詢、更新和刪除數據操作。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。現在許多資料庫管理系統都支持多種不同的存儲引擎。MySQL 的核心就是存儲引擎。
  提示:InnoDB 事務型資料庫的首選引擎,支持事務安全表(ACID),支持行鎖定和外鍵。MySQL 5.5.5 之後,InnoDB 作為預設存儲引擎。MyISAM 是基於 ISAM 的存儲引擎,並對其進行擴展,是在 Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。MyISAM 擁有較高的插入、查詢速度,但不支持事務。MEMORY 存儲引擎將表中的數據存儲到記憶體中,為查詢和引用其他數據提供快速訪問。

2. MySQL 5.7 支持的存儲引擎

  MySQL 支持多種類型的資料庫引擎,可分別根據各個引擎的功能和特性為不同的資料庫處理任務提供各自不同的適應性和靈活性。在 MySQL 中,可以利用 SHOW ENGINES 語句來顯示可用的資料庫引擎和預設引擎。
  MySQL 提供了多個不同的存儲引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。在 MySQL 中,不需要在整個伺服器中使用同一種存儲引擎,針對具體的要求,可以對每一個表使用不同的存儲引擎。
  MySQL 5.7 支持的存儲引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。可以使用SHOW ENGINES語句查看系統所支持的引擎類型,結果如圖所示。

 

3. MySQL 預設存儲引擎

InnoDB 是系統的預設引擎,支持可靠的事務處理。
使用下麵的語句可以修改資料庫臨時的預設存儲引擎
SET default_storage_engine=< 存儲引擎名 >
例如,將 MySQL 資料庫的臨時預設存儲引擎修改為 MyISAM,輸入的 SQL 語句和運行結果如圖所示。

 

此時,可以發現 MySQL 的預設存儲引擎已經變成了 MyISAM。但是當再次重啟客戶端時,預設存儲引擎仍然是 InnoDB。

六、Mysql數據類型介紹

1. 基本介紹

在 MySQL 中常見的數據類型如下:

  1. 整數類型
    包括 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,浮點數類型 FLOAT 和 DOUBLE,定點數類型 DECIMAL。
  2. 日期/時間類型
    包括 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。
  3. 字元串類型
    包括 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET 等。
  4. 二進位類型
    包括 BIT、BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。

2. 整數類型

  MySQL 提供了多種數值型數據類型,不同的數據類型提供不同的取值範圍,可以存儲的值範圍越大,所需的存儲空間也會越大。
  MySQL 主要提供的整數類型有 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,其屬性欄位可以添加 AUTO_INCREMENT 自增約束條件。下表中列出了 MySQL 中的數值類型。

 

從上表中可以看到,不同類型的整數存儲所需的位元組數不相同,占用位元組數最小的是 TINYINT 類型,占用位元組最大的是 BIGINT 類型,占用的位元組越多的類型所能表示的數值範圍越大。

根據占用位元組數可以求出每一種數據類型的取值範圍。例如,TINYINT 需要 1 個位元組(8bit)來存儲,那麼 TINYINT 無符號數的最大值為 28-1,即 255;TINYINT 有符號數的最大值為 27-1,即 127。其他類型的整數的取值範圍計算方法相同,如下表所示。

 

提示:顯示寬度和數據類型的取值範圍是無關的。顯示寬度只是指明 MySQL 最大可能顯示的數字個數,數值的位數小於指定的寬度時會由空格填充。如果插入了大於顯示寬度的值,只要該值不超過該類型整數的取值範圍,數值依然可以插入,而且能夠顯示出來。例如,year 欄位插入 19999,當使用 SELECT 查詢該列值的時候,MySQL 顯示的將是完整的帶有 5 位數字的 19999,而不是 4 位數字的值。

3. 小數類型

  MySQL 中使用浮點數和定點數來表示小數。
  浮點類型有兩種,分別是單精度浮點數(FLOAT)和雙精度浮點數(DOUBLE);定點類型只有一種,就是 DECIMAL。
  浮點類型和定點類型都可以用(M, D)來表示,其中M稱為精度,表示總共的位數;D稱為標度,表示小數的位數。
  浮點數類型的取值範圍為 M(1~255)和 D(1~30,且不能大於 M-2),分別表示顯示寬度和小數位數。M 和 D 在 FLOAT 和DOUBLE 中是可選的,FLOAT 和 DOUBLE 類型將被保存為硬體所支持的最大精度。DECIMAL 的預設 D 值為 0、M 值為 10。
  下表中列出了 MySQL 中的小數類型和存儲需求。

 

FLOAT 類型的取值範圍如下:
有符號的取值範圍:-3.402823466E+38~-1.175494351E-38。
無符號的取值範圍:0 和 -1.175494351E-38~-3.402823466E+38。

DOUBLE 類型的取值範圍如下:
有符號的取值範圍:-1.7976931348623157E+308~-2.2250738585072014E-308。
無符號的取值範圍:0 和 -2.2250738585072014E-308~-1.7976931348623157E+308。
提示:不論是定點還是浮點類型,如果用戶指定的精度超出精度範圍,則會四捨五入進行處理。
FLOAT 和 DOUBLE 在不指定精度時,預設會按照實際的精度(由電腦硬體和操作系統決定),DECIMAL 如果不指定精度,預設為(10,0)。

浮點數相對於定點數的優點是在長度一定的情況下,浮點數能夠表示更大的範圍;缺點是會引起精度問題。

最後再強調一下:在 MySQL 中,定點數以字元串形式存儲,在對精度要求比較高的時候(如貨幣、科學數據),使用 DECIMAL 的類型比較好,另外兩個浮點數進行減法和比較運算時也容易出問題,所以在使用浮點數時需要註意,並儘量避免做浮點數比較。

4. 日期和時間類型

  MySQL 中有多處表示日期的數據類型:YEAR、TIME、DATE、DTAETIME、TIMESTAMP。當只記錄年信息的時候,可以只使用 YEAR 類型。
  每一個類型都有合法的取值範圍,當指定確定不合法的值時,系統將“零”值插入資料庫中。
  下表中列出了 MySQL 中的日期與時間類型。

 

YEAR 類型
YEAR 類型是一個單位元組類型,用於表示年,在存儲時只需要 1 個位元組。可以使用各種格式指定 YEAR,如下所示:
以 4 位字元串或者 4 位數字格式表示的 YEAR,範圍為 '1901'~'2155'。輸入格式為 'YYYY' 或者 YYYY,例如,輸入 '2010' 或 2010,插入資料庫的值均為 2010。
以 2 位字元串格式表示的 YEAR,範圍為 '00' 到 '99'。'00'~'69' 和 '70'~'99' 範圍的值分別被轉換為 2000~2069 和 1970~1999 範圍的 YEAR 值。'0' 與 '00' 的作用相同。插入超過取值範圍的值將被轉換為 2000。
以 2 位數字表示的 YEAR,範圍為 1~99。1~99 和 70~99 範圍的值分別被轉換為 2001~2069 和 1970~1999 範圍的 YEAR 值。註意,在這裡 0 值將被轉換為 0000,而不是 2000。
提示:兩位整數範圍與兩位字元串範圍稍有不同。例如,插入 3000 年,讀者可能會使用數字格式的 0 表示 YEAR,實際上,插入資料庫的值為 0000,而不是所希望的 3000。只有使用字元串格式的 '0' 或 '00',才可以被正確解釋為 3000,非法 YEAR值將被轉換為 0000。

TIME 類型
TIME 類型用於只需要時間信息的值,在存儲時需要 3 個位元組。格式為 HH:MM:SS。HH 表示小時,MM 表示分鐘,SS 表示秒。

TIME 類型的取值範圍為 -838:59:59~838:59:59,小時部分如此大的原因是 TIME 類型不僅可以用於表示一天的時間(必須小於 24 小時),還可能是某個事件過去的時間或兩個事件之間的時間間隔(可大於 24 小時,或者甚至為負)。

可以使用各種格式指定 TIME 值,如下所示。
'D HH:MM:SS' 格式的字元串。還可以使用這些“非嚴格”的語法:'HH:MM:SS'、'HH:MM'、'D HH' 或 'SS'。這裡的 D 表示日,可以取 0~34 之間的值。在插入資料庫時,D 被轉換為小時保存,格式為 “D*24+HH”。
'HHMMSS' 格式、沒有間隔符的字元串或者 HHMMSS 格式的數值,假定是有意義的時間。例如,'101112' 被理解為'10:11:12',但是 '106112' 是不合法的(它有一個沒有意義的分鐘部分),在存儲時將變為 00:00:00。
提示:為 TIME 列分配簡寫值時應註意:如果沒有冒號,MySQL 解釋值時,假定最右邊的兩位表示秒。(MySQL 解釋 TIME 值為過去的時間而不是當前的時間)。例如,讀者可能認為 '1112' 和 1112 表示 11:12:00(即 11 點過 12 分鐘),但MySQL 將它們解釋為 00:11:12(即 11 分 12 秒)。同樣 '12' 和 12 被解釋為00:00:12。相反,TIME 值中如果使用冒號則肯定被看作當天的時間,也就是說,'11:12' 表示 11:12:00,而不是 00:11:12。

DATE 類型
DATE 類型用於僅需要日期值時,沒有時間部分,在存儲時需要 3 個位元組。日期格式為 'YYYY-MM-DD',其中 YYYY 表示年,MM 表示月,DD 表示日。

在給 DATE 類型的欄位賦值時,可以使用字元串類型或者數字類型的數據插入,只要符合 DATE 的日期格式即可。如下所示:
以 'YYYY-MM-DD' 或者 'YYYYMMDD' 字元中格式表示的日期,取值範圍為 '1000-01-01'~'9999-12-3'。例如,輸入 '2015-12-31' 或者 '20151231',插入資料庫的日期為2015-12-31。
以 'YY-MM-DD' 或者 'YYMMDD' 字元串格式表示日期,在這裡YY表示兩位的年值。MySQL 解釋兩位年值的規則:'00~69' 範圍的年值轉換為 '20002069','7099' 範圍的年值轉換為 '1970~1999'。例如,輸入 '15-12-31',插入資料庫的日期為 2015-12-31;輸入 '991231',插入資料庫的日期為 1999-12-31。
以 YYMMDD 數字格式表示的日期,與前面相似,00~69 範圍的年值轉換為 2000~2069,80~99 範圍的年值轉換為 1980~1999。例如,輸入 151231,插入資料庫的日期為 2015-12-31,輸入 991231,插入資料庫的日期為 1999-12-31。
使用 CURRENT_DATE 或者 NOW(),插入當前系統日期。
提示:MySQL 允許“不嚴格”語法:任何標點符號都可以用作日期部分之間的間隔符。例如,'98-11-31'、'98.11.31'、'98/11/31'和'98@11@31' 是等價的,這些值也可以正確地插入資料庫。

DATETIME 類型
DATETIME 類型用於需要同時包含日期和時間信息的值,在存儲時需要 8 個位元組。日期格式為 'YYYY-MM-DD HH:MM:SS',其中 YYYY 表示年,MM 表示月,DD 表示日,HH 表示小時,MM 表示分鐘,SS 表示秒。

在給 DATETIME 類型的欄位賦值時,可以使用字元串類型或者數字類型的數據插入,只要符合 DATETIME 的日期格式即可,如下所示。
以 'YYYY-MM-DD HH:MM:SS' 或者 'YYYYMMDDHHMMSS' 字元串格式表示的日期,取值範圍為 '1000-01-01 00:00:00'~'9999-12-3 23:59:59'。例如,輸入 '2014-12-31 05:05:05' 或者 '20141231050505’,插入資料庫的 DATETIME 值都為 2014-12-31 05:05:05。
以 'YY-MM-DD HH:MM:SS' 或者 'YYMMDDHHMMSS' 字元串格式表示的日期,在這裡 YY 表示兩位的年值。與前面相同,'00~79' 範圍的年值轉換為 '2000~2079','80~99' 範圍的年值轉換為 '1980~1999'。例如,輸入 '14-12-31 05:05:05',插入資料庫的 DATETIME 為 2014-12-31 05:05:05;輸入 141231050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05。
以 YYYYMMDDHHMMSS 或者 YYMMDDHHMMSS 數字格式表示的日期和時間。例如,輸入 20141231050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05;輸入 140505050505,插入資料庫的 DATETIME 為 2014-12-31 05:05:05。
提示:MySQL 允許“不嚴格”語法:任何標點符號都可用作日期部分或時間部分之間的間隔符。例如,'98-12-31 11:30:45'、'98.12.31 11+30+35'、'98/12/31 113045' 和 '98@12@31 113045' 是等價的,這些值都可以正確地插入資料庫。

TIMESTAMP 類型
TIMESTAMP 的顯示格式與 DATETIME 相同,顯示寬度固定在 19 個字元,日期格式為 YYYY-MM-DD HH:MM:SS,在存儲時需要 4 個位元組。但是 TIMESTAMP 列的取值範圍小於 DATETIME 的取值範圍,為 '1970-01-01 00:00:01'UTC~'2038-01-19 03:14:07'UTC。在插入數據時,要保證在合法的取值範圍內。
提示:協調世界時(英:Coordinated Universal Time,法:Temps Universel Coordonné)又稱為世界統一時間、世界標準時間、國際協調時間。英文(CUT)和法文(TUC)的縮寫不同,作為妥協,簡稱 UTC。

TIMESTAMP 與 DATETIME 除了存儲位元組和支持的範圍不同外,還有一個最大的區別是:
DATETIME 在存儲日期數據時,按實際輸入的格式存儲,即輸入什麼就存儲什麼,與時區無關;
而 TIMESTAMP 值的存儲是以 UTC(世界標準時間)格式保存的,存儲時對當前時區進行轉換,檢索時再轉換回當前時區。即查詢時,根據當前時區的不同,顯示的時間值是不同的。
提示:如果為一個 DATETIME 或 TIMESTAMP 對象分配一個 DATE 值,結果值的時間部分被設置為 '00:00:00',因此 DATE 值未包含時間信息。如果為一個 DATE 對象分配一個 DATETIME 或 TIMESTAMP 值,結果值的時間部分被刪除,因此DATE 值未包含時間信息。

5. 字元串類型

  字元串類型用來存儲字元串數據,還可以存儲圖片和聲音的二進位數據。字元串可以區分或者不區分大小寫的串比較,還可以進行正則表達式的匹配查找。
  MySQL 中的字元串類型有 CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT、ENUM、SET 等。
  下表中列出了 MySQL 中的字元串數據類型,括弧中的M表示可以為其指定長度。

 

VARCHAR 和 TEXT 類型是變長類型,其存儲需求取決於列值的實際長度(在前面的表格中用 L 表示),而不是取決於類型的最大可能尺寸。

例如,一個 VARCHAR(10) 列能保存一個最大長度為 10 個字元的字元串,實際的存儲需要字元串的長度 L 加上一個位元組以記錄字元串的長度。對於字元 “abcd”,L 是 4,而存儲要求 5 個位元組。

CHAR 和 VARCHAR 類型
CHAR(M) 為固定長度字元串,在定義時指定字元串列長。當保存時,在右側填充空格以達到指定的長度。M 表示列的長度,範圍是 0~255 個字元。

例如,CHAR(4) 定義了一個固定長度的字元串列,包含的字元個數最大為 4。當檢索到 CHAR 值時,尾部的空格將被刪除。

VARCHAR(M) 是長度可變的字元串,M 表示最大列的長度,M 的範圍是 0~65535。VARCHAR 的最大實際長度由最長的行的大小和使用的字元集確定,而實際占用的空間為字元串的實際長度加 1。

例如,VARCHAR(50) 定義了一個最大長度為 50 的字元串,如果插入的字元串只有 10 個字元,則實際存儲的字元串為 10 個字元和一個字元串結束字元。VARCHAR 在值保存和檢索時尾部的空格仍保留。

【實例】下麵將不同的字元串保存到 CHAR(4) 和 VARCHAR(4) 列,說明 CHAR 和 VARCHAR 之間的差別,如下表所示。

插入值 CHAR(4) 存儲需求 VARCHAR(4) 存儲需求
' ' ' ' 4位元組 '' 1位元組
'ab' 'ab ' 4位元組 'ab' 3位元組
'abc' 'abc ' 4位元組 'abc' 4位元組
'abcd' 'abcd' 4位元組 'abcd' 5位元組
'abcdef' 'abcd' 4位元組 'abcd' 5位元組
對比結果可以看到,CHAR(4) 定義了固定長度為 4 的列,無論存入的數據長度為多少,所占用的空間均為 4 個位元組。VARCHAR(4) 定義的列所占的位元組數為實際長度加 1。
TEXT 類型
TEXT 列保存非二進位字元串,如文章內容、評論等。當保存或查詢 TEXT 列的值時,不刪除尾部空格。

TEXT 類型分為 4 種:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。不同的 TEXT 類型的存儲空間和數據長度不同。
TINYTEXT 表示長度為 255(28-1)字元的 TEXT 列。
TEXT 表示長度為 65535(216-1)字元的 TEXT 列。
MEDIUMTEXT 表示長度為 16777215(224-1)字元的 TEXT 列。
LONGTEXT 表示長度為 4294967295 或 4GB(232-1)字元的 TEXT 列。

ENUM 類型
ENUM 是一個字元串對象,值為表創建時列規定中枚舉的一列值。其語法格式如下:
<欄位名> ENUM( '值1', '值1', …, '值n' )
欄位名指將要定義的欄位,值 n 指枚舉列表中第 n 個值。

ENUM 類型的欄位在取值時,能在指定的枚舉列表中獲取,而且一次只能取一個。如果創建的成員中有空格,尾部的空格將自動被刪除。

ENUM 值在內部用整數表示,每個枚舉值均有一個索引值;列表值所允許的成員值從 1 開始編號,MySQL 存儲的就是這個索引編號,枚舉最多可以有 65535 個元素。

例如,定義 ENUM 類型的列('first','second','third'),該列可以取的值和每個值的索引如下表所示。

值 索引
NULL NULL
'' 0
’first 1
second 2
third 3
ENUM 值依照列索引順序排列,並且空字元串排在非空字元串前,NULL 值排在其他所有枚舉值前。
提示:ENUM 列總有一個預設值。如果將 ENUM 列聲明為 NULL,NULL 值則為該列的一個有效值,並且預設值為 NULL。如果 ENUM 列被聲明為 NOT NULL,其預設值為允許的值列表的第 1 個元素。

SET 類型
SET 是一個字元串的對象,可以有零或多個值,SET 列最多可以有 64 個成員,值為表創建時規定的一列值。指定包括多個 SET 成員的 SET 列值時,各成員之間用逗號,隔開,語法格式如下:
SET( '值1', '值2', …, '值n' )
與 ENUM 類型相同,SET 值在內部用整數表示,列表中每個值都有一個索引編號。當創建表時,SET 成員值的尾部空格將自動刪除。

但與 ENUM 類型不同的是,ENUM 類型的欄位只能從定義的列值中選擇一個值插入,而 SET 類型的列可從定義的列值中選擇多個字元的聯合。
提示:如果插入 SET 欄位中的列值有重覆,則 MySQL 自動刪除重覆的值;插入 SET 欄位的值的順序並不重要,MySQL 會在存入資料庫時,按照定義的順序顯示;如果插入了不正確的值,預設情況下,MySQL 將忽視這些值,給出警告。

七、Mysql主要專業名稱介紹

1. 主鍵

1.1 什麼是主鍵
“主鍵(PRIMARY KEY)”的完整稱呼是“主鍵約束”。MySQL 主鍵約束是一個列或者列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵,通過它可以強製表的實體完整性。

1.2 選取設置主鍵約束的欄位
主鍵約束即在表中定義一個主鍵來唯一確定表中每一行數據的標識符。主鍵可以是表中的某一列或者多列的組合,其中由多列組合的主鍵稱為複合主鍵。主鍵應該遵守下麵的規則:

  • 每個表只能定義一個主鍵。
  • 主鍵值必須唯一標識表中的每一行,且不能為 NULL,即表中不可能存在兩行數據有相同的主鍵值。這是唯一性原則。
  • 一個列名只能在複合主
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 windows物理機與虛擬機設置共用目錄 1.1 WMware Workstation點擊重新安裝WMware Tools 此時會彈出在客戶機裝載CD驅動來解壓安裝程式,然後執行vmware-install.pl 1.2 新建虛擬光碟機掛載目錄 1.3 掛載虛擬光碟機 1.4 將安裝包複製到根目錄下 ...
  • 1、打開當前目錄 explorer . 2、打開上級目錄 explorer .. 3、打開任意目錄 explorer dirname ...
  • 在以往的資料庫設計中,我們通過會用到一些資料庫的設計工具,有針對Mysql的Mysql workbench, PowerDesign等等工具,可以通過這些工具創建資料庫的ER模型圖,但是這些都是客戶端應用程式需要下載完成,比較麻煩。 今天搜索到一個線上製圖網站,提供了對資料庫ER模型進行線上設計而且 ...
  • 出現這個錯誤的原因是時區有問題,可以在mysql中執行命令: set global time_zone='+8:00'; 如上是修改為北京時間(GMT+0800)。 查看修改: show variables like '%time_zone%'; ...
  • 轉自 https://www.cnblogs.com/ShaYeBlog/p/7729714.html1.Oracle11G 32BIT介質官方鏈接適用於Windows 32bit的Oracle Database 11G 第2版U4(11.2.0.4)Oracle11.2.0.4 Windows32 ...
  • 若一個資料庫同時涉及兩個以上的表,則稱之為連接查詢。連接查詢包括內連接查詢、自連接查詢、外連接查詢。 1.等值與非等值連接查詢 連接查詢的一般格式為:select 表名1.列名,表名2.列名 from 表名1,表名2 where 表名1.列名 <比較運算符> 表名2.列名,其中比較運算符包括=、>、 ...
  • 原文地址: "Flink本地安裝和創建Flink應用" ...
  • SQL 行轉列,列轉行 行列轉換在做報表分析時還是經常會遇到的,今天就說一下如何實現行列轉換吧。 行列轉換就是如下圖所示兩種展示形式的互相轉換 行轉列 假如我們有下表: 通過上面 SQL 語句即可得到下麵的結果 PIVOT 後跟一個聚合函數來拿到結果,FOR 後面跟的科目是我們要轉換的列,這樣的話科 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...