MySQL基礎與常用數據類型淺析

一.MySQL數據類型分類

二.數值類型?

2.1int類型?

我們使用TINYINT作為例子進行實驗驗證:

越界插入會直接報錯,跟我們當時學習語言的時候不太一樣,語言會進行隱式類型轉換或截斷.一般不會直接報錯.其他的int類型也是同理.

說明:

  • 在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。
  • 可以通過UNSIGNED來說明某個字段是無符號的

2.2bit類型?

基本語法:

bit[(M)] : 位字段類型。M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。

我們舉個栗子:

很奇怪,我們的online明明設置的是0,為什么什么都沒有顯示,是因為它顯示的時候默認按照ascii碼來顯示的,我們換成十進制顯示即可看到它的值:

bit使用的注意事項:
bit字段在顯示時,是按照ASCII碼對應的值顯示。

mysql> insert into tt4 values(65, 65);
mysql> select * from tt4;
+------+------+
| id | a      |
+------+------+
| 10 |        |
| 65 | A      |
+------+------+

如果我們有這樣的值,只存放0或1,這時可以定義bit(1)。這樣可以節省空間

mysql> create table tt5(gender bit(1));
mysql> insert into tt5 values(0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt5 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt5 values(2); -- 當插入2時,已經越界了
ERROR 1406 (22001): Data too long for column 'gender' at row 1

2.3小數類型?

因為double與float類似,所以我們這里以float與decimal作為對比:

mysql> create table tt6(id int, salary float(4,2));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt6 values(100, -99.99);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt6 values(101, -99.991); #多的這一點被拿掉了
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt6;
+------+--------+
| id | salary |
+------+--------+
| 100 | -99.99 |
| 101 | -99.99 |
+------+--------+
2 rows in set (0.00 sec)

如果定義的是float(4,2) unsigned 這時,因為把它指定為無符號的數,范圍是 0 ~ 99.99

mysql> create table tt7(id int, salary float(4,2) unsigned);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tt7 values(100, -0.1);
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------+
| Warning | 1264 | Out of range value for column 'salary' at row 1 |
+---------+------+-------------------------------------------------+
1 row in set (0.00 sec)
mysql> insert into tt7 values(100, -0);
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt7 values(100, 99.99);
Query OK, 1 row affected (0.00 sec)

decimal(5,2) 表示的范圍是 -999.99 ~ 999.99 decimal(5,2) unsigned 表示的范圍 0 ~ 999.99 decimal和float很像,但是有區別:float和decimal表示的精度不一樣

mysql> create table tt8 ( id int, salary float(10,8), salary2
decimal(10,8));
mysql> insert into tt8 values(100,23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt8;
+------+-------------+-------------+
| id | salary | salary2 |
+------+-------------+-------------+
| 100 | 23.12345695 | 23.12345612 | # 發現decimal的精度更準確,因此如果我們希望某
個數據表示高精度,選擇decimal
+------+-------------+-------------+

decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0.如果m被省略,默認是10。

三.文本,二進制類型?

?怎么理解char與varchar的區別呢?我們通過下面的例子來進行理解:

mysql> create table tt9(id int, name char(2));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into tt9 values(100, 'ab');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tt9 values(101, '中國');
Query OK, 1 row affected (0.00 sec)
mysql> select * from tt9;
+------+--------+
| id | name |
+------+--------+
| 100 | ab |
| 101 | 中國 |
+------+--------+

說明:

char(2) 表示可以存放兩個字符,可以是字母或漢字,但是不能超過2個, 最多只能是255

mysql> create table tt10(id int ,name char(256));
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use
BLOB or TEXT instead

而對于varchar:

mysql> create table tt10(id int ,name varchar(6)); --表示這里可以存放6個字符
mysql> insert into tt10 values(100, 'hello');
mysql> insert into tt10 values(100, '我愛你,中國');
mysql> select * from tt10;
+------+--------------------+
| id | name |
+------+--------------------+
| 100 | hello |
| 100 | 我愛你,中國 |
+------+--------------------+

說明:

  • 關于varchar(len),len到底是多大,這個len值,和表的編碼密切相關:varchar長度可以指定為0到65535之間的值,但是有1 - 2 個字節用于記錄數據大小,所以說有效字節數是65533。
  • 當我們的表的編碼是utf8時,varchar(n)的參數n最大值是65532/3=21844[因為utf中,一個字符占用3個字節],如果編碼是gbk,varchar(n)的參數n最大是65532/2=32766(因為gbk中,一個字符占用2字節)。
mysql> create table tt11(name varchar(21845))charset=utf8; --驗證了utf8確實是不
能超過21844
ERROR 1118 (42000): Row size too large. The maximum row size for the used
table type, not counting BLOBs, is 65535. You have to change some columns to
TEXT or BLOBs
mysql> create table tt11(name varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.01 sec)

四.日期和時間類型

常用的日期有如下三個:

  • date :日期 'yyyy-mm-dd' ,占用三字節
  • datetime 時間日期格式 'yyyy-mm-dd HH:ii:ss' 表示范圍從 1000 到 9999 ,占用八字節
  • timestamp :時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字節
//創建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);
Query OK, 0 rows affected (0.01 sec)
//插入數據:
mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); --插入兩
種時間
Query OK, 1 row affected (0.00 sec)
mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2017-11-12 18:28:55 | --添加數據時,時間戳自動補
上當前時間
+------------+---------------------+---------------------+
//更新數據:
mysql> update birthday set t1='2000-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2017-11-12 18:32:09 | -- 更新數據,時間戳會更新
成當前時間
+------------+---------------------+---------------------+

五.enum與set類型

通俗點來說,前者是'單選'類型,后者是'多選'類型.就跟我們平常的時候填寫的表格一樣:

enum語法:

#enum:枚舉,“單選”類型;
enum('選項1','選項2','選項3',...);

該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,....最多65535個;當我們添加枚舉值時,也可以添加對應的數字編號.

set語法:

#set:集合,“多選”類型;
set('選項值1','選項值2','選項值3', ...);

該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,....最多64個。
案例:
有一個調查表votes,需要調查人的喜好, 比如(登山,游泳,籃球,武術)中去選擇(可以多選), (男,女)[單選]

mysql> create table votes(
-> username varchar(30),
-> hobby set('登山','游泳','籃球','武術'), --注意:使用數字標識每個愛好的時候,想想
Linux權限,采用比特位位置來個set中的愛好對應起來
-> gender enum('男','女')); --注意:使用數字標識的時候,就是正常的數組下標
Query OK, 0 rows affected (0.02 sec)

插入數據:

insert into votes values('雷鋒', '登山,武術', '男');
insert into votes values('Juse','登山,武術',2);
select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| Juse | 登山,武術 |女 |
+----------+---------------+--------+

有如下數據,想查找所有喜歡登山的人:

+-----------+---------------+--------+
| username | hobby | gender |
+-----------+---------------+--------+
| 雷鋒 | 登山,武術 | 男 |
| Juse | 登山,武術 | 女 |
| LiLei | 登山 | 男 |
| LiLei | 籃球 | 男 |
| HanMeiMei | 游泳 | 女 |
+-----------+---------------+--------+

使用如下查詢語句:

mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby | gender |
+----------+--------+--------+
| LiLei | 登山 | 男 |
+----------+--------+--------+

發現這種查詢方式是嚴格匹配的,那我們怎么查詢所有愛好中包含登山的人呢,這里引入一個新函數find_in_set.find_in_set(sub,str_list) :如果 sub 在 str_list 中,則返回下標;如果不在,返回0;str_list是用逗號分隔的字符串。

查詢愛好登山的人:
?

mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby | gender |
+----------+---------------+--------+
| 雷鋒 | 登山,武術 | 男 |
| Juse | 登山,武術 | 女 |
| LiLei | 登山 | 男 |
+----------+---------------+--------+

我們發現這里的where相當于我們c/c++中的if判斷語句,而find_in_set僅可以查詢一個元素是否在對應集合中:

mysql> select * from votes where find_in_set('登山,武術', hobby);#錯誤寫法

那如果我們想查找既喜歡武術又喜歡登山的人該如何寫呢,可以這樣:

mysql> select * from votes where find_in_set('登山', hobby) and find_in_set('武術',hobby);


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909781.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909781.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909781.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Ubuntu 20.04離線安裝Nvidia-docker

服務器因系統故障重裝,安裝docker容器時發現幾年前的在線安裝步驟不好使了,只好嘗試離線安裝。為了下次不卡殼,記錄一下安裝步驟。 先確定自己的操作系統,并確保已經安裝了nvidia driver。我的操作系統是Ubuntu 20.04。 1. 下載…

6,TCP客戶端

1,創建一個新的項目 2,界面設計

【dify更新問題】如何更新dify且低成本解決git pull 443問題

我的dify部署在mini server上,掛不了TZ,所以采用了如下辦法 更新origin (.git/config) 地址為:https://gitee.com/dify_ai/dify.git 順序執行 (https://docs.dify.ai/en/getting-started/install-self-hosted/docker-compose#upg…

即時通訊消息推送技術深度解析:從底層原理到行業實踐-優雅草卓伊凡|片翼|擱淺

即時通訊消息推送技術深度解析:從底層原理到行業實踐-優雅草卓伊凡|片翼|擱淺 引言:重新啟程的即時通訊項目 優雅草科技的卓伊凡最近重啟了即時通訊項目的二次開發工作,在這個萬物互聯的時代,消息推送通知作為IM系統的核心功能之…

Joomla jdoc 語法使用介紹

jdoc 語句包含在每個 Joomla 模板中&#xff0c;用于指示 Joomla 或其擴展的其他部分輸出內容在整個網頁中的位置。本文將簡單的介紹一下Joomla模板開發中常用到的<jdoc>標簽語法&#xff0c;并且介紹不同類型的<jdoc>標簽元素的功能。 JDoc語句 一個典型的 jdoc…

Linux history 命令

Linux history 命令詳解 history 是 Linux 系統中一個非常實用的命令&#xff0c;用于查看、管理和操作當前 Shell 會話中執行過的命令歷史記錄。它可以幫助用戶快速重復執行命令、搜索歷史記錄、清除敏感命令等&#xff0c;極大地提高了命令行操作的效率。 一、基本用法 顯示…

側信道分析中的簡單模板攻擊(TA)Python實現(帶測試)

一、模板攻擊原理 模板攻擊&#xff08;Template Attacks, TA&#xff09;是一種高效的側信道分析方法&#xff0c;利用密碼設備運行時的物理泄漏信息&#xff08;如功耗&#xff09;恢復密鑰。其核心思想是通過建模密鑰相關中間值的泄漏特征&#xff0c;構建攻擊模板。模板攻…

AI集群全光交換網絡技術原理與發展趨勢研究

? 引言 隨著人工智能技術的飛速發展&#xff0c;AI訓練集群對網絡互連的帶寬、延遲和能效提出了前所未有的挑戰。全光交換網絡作為一種新興技術&#xff0c;正在成為解決這些挑戰的關鍵方案。 全光交換網絡的基本概念 全光交換網絡(Optical Circuit Switch, OCS)是一種利用…

PHP Swoft2 框架精華系列:Validator 校驗器詳解

文章目錄 校驗器校驗器類型@Validate 注解屬性說明校驗器校驗主要流程系統校驗器每個屬性存儲結構校驗器規則定義,注解、注解解析器定義校驗器注解使用實現一個自定義的校驗器校驗器注解校驗器注解解析器校驗器規則系統校驗器Controller/Action 綁定校驗器校驗器 校驗器是 sw…

MySQL 類型轉換與加密函數深度解析

MySQL 類型轉換與加密函數深度解析 一、類型轉換函數詳解 1. 顯式類型轉換 CAST 函數 CAST(expression AS type)支持類型&#xff1a;BINARY, CHAR, DATE, DATETIME, TIME, DECIMAL, SIGNED [INTEGER], UNSIGNED [INTEGER]示例&#xff1a;SELECT CAST(2023-08-15 AS DATE);…

FPGA基礎 -- Verilog 行為級建模之條件語句

Verilog 的行為級建模&#xff08;Behavioral Modeling&#xff09;中的條件語句&#xff08;Conditional Statements&#xff09;&#xff0c;逐步從基礎到實際工程應用&#xff0c;適合有RTL開發基礎但希望深入行為建模的人。 一、行為級建模簡介 行為級建模&#xff08;Beh…

linux618 NFS web.cn NFS.cn backup.cn

權限問題 推測 ssh root登錄失敗 root192.168.235.100s password: ???????? root192.168.235.100s password: ???????? root192.168.235.100s password: ???????? root192.168.235.100s password: ???????? root192.168.235.100s password: …

氧化鐿:稀土科技的“夜視高手”

氧化鐿&#xff08;Yb?O?&#xff09;是一種重要的稀土氧化物&#xff0c;這種略帶黃色的粉末&#xff0c;既不像黃金那樣耀眼&#xff0c;也不像稀土家族里的“明星”如釹、鋱那樣廣為人知&#xff0c;卻在背后默默支撐著許多高科技產業&#xff0c;特別是在紅外技術領域&am…

class對象【C#】2025復習

對象 西方思想是&#xff1a;復雜的事讓秘書去做就行。老板只需簡單的下達命令。 代碼格式如下 秘書類型 秘書A new 秘書類型(); . 秘書A.開始工作(); // 調用實例對象的方法。 特別注意的是&#xff0c;程序只會用到 秘書A&#xff0c;秘書B&…

Qt程序啟動動畫

一、Qt有3種方式實現程序啟動動畫&#xff08;介紹&#xff09; 1、QSplashScreen 靜態圖片(png、jpg等格式) 2、QMovie 動態圖片(gif格式) 3、QAxWidget 視頻(swf格式) 1.QSplashScreen 靜態圖片(png、jpg等格式) //創建啟動動畫類實例 QSplashScreen splash(QPixmap(&qu…

貪心算法經典問題

目錄 貪心思想 一、Dijkstra最短路問題 問題描述&#xff1a; 貪心策略&#xff1a; 二、Prim 和 Kruskal 最小生成樹問題 Prim 算法&#xff1a; Kruskal 算法&#xff1a; 三、Huffman樹問題 問題描述&#xff1a; 貪心策略&#xff1a; 四、背包問題 問題描述&a…

零知開源——STM32F4實現ILI9486顯示屏UI界面系列教程(一):電子書閱讀器功能

本教程將詳細介紹如何在零知增強板上使用3.5寸ILI9486顯示屏實現電子書閱讀器功能。我們將使用LVGL庫構建用戶界面&#xff0c;并實現翻頁、進度顯示等核心功能。 目錄 一、硬件連接 二、軟件UI組件實現 三、零知IDE配置 四、演示效果 五、常見問題解決 六、總結與擴展 一…

支持selenium的chrome driver更新到137.0.7151.119

最近chrome釋放新版本&#xff1a;137.0.7151.119 如果運行selenium自動化測試出現以下問題&#xff0c;是需要升級chromedriver才可以解決的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…

架構下的最終瓶頸:數據庫如何破局?

在分布式系統和云原生架構逐漸成熟的當下&#xff0c;我們已能夠靈活擴展計算資源、水平擴展服務節點、拆分業務模塊等。然而&#xff0c;在經歷過多輪架構優化之后&#xff0c;數據庫常常成為系統的“最后瓶頸”。尤其當數據量、并發量、實時性要求劇增時&#xff0c;數據庫即…

湖北理元理律師事務所小微企業債務重組方案:司法與經營的共生邏輯

小微企業債務問題常陷入“救企業還是保老板”的困局。湖北理元理律師事務所為某汽車零部件供應商設計的“經營性債務重組”方案&#xff0c;提供了創新解題思路。 核心矛盾拆解 該企業面臨三重困境&#xff1a; 矛盾類型 具體表現 法律風險等級 擔保鏈危機 老板個人擔保牽…