4. 數據類型

4.1 數據類型分類

分類
數據類型
說明
數值類型
BIT(M)
位類型。M指定位數,默認值1,范圍1 - 64
TINYINT [UNSIGNED]
帶符號的范圍 -128 ~ 127,無符號范圍0 ~ 255,默認有符號
BOOL
使用0和1表示真和假
SMALLINT [UNSIGNED]
帶符號是次方到,無符號是

INT [UNSIGNED]
帶符號是次方到,無符號是

BIGINT [UNSIGNED]
帶符號是次方到,無符號是

FLOAT(M,D)[UNSIGNED]
M指定顯示長度,D指定小數位數,占用4字節
DOUBLE[(M,D)][UNSIGNED]
表示比float精度更大的小數,占用空間8字節
DECIMAL(M,D)[UNSIGNED]
定點數,M指定長度,D表示小數點的位數
文本、二進制類型
CHAR(size)
固定長度字符串,最大255
文本、二進制類型
VARCHAR(SIZE)
可變長度字符串,最大長度65535
文本、二進制類型
BLOB
二進制數據
文本、二進制類型
TEXT
大文本,不支持全文索引,不支持默認值
時間日期類型
DATE/DATETIME/TIMESTAMP
日期類型(yyyy - nn - dd)、(yyyy - n - d hh:mm:ss),timestamp時間戳
String類型
ENUM類型
ENUM是一個字符串對象,其值來自表創建時在列規定中顯示枚舉的一列值
SET類型
SET是一個字符串對象,可以有零或多個值,其值來自表創建時規定的允許的一列值。指定包括多個set成員的set列值時各成員之間用逗號間隔開,set成員值本身不能包含逗號

4.2 數值類型

類型
字節
最小值(帶符號的/無符號的)
最大值(帶符號的/無符號的)
TINYINT
1
-128 / 0
127 / 255
SMALLINT
2
-32768 / 0
32767 / 65535
MEDIUMINT
3
-8388608 / 0
8388607 / 16777215
INT
4
-2147483648 / 0
2147483647 / 4294967295
BIGINT
8
-9223372036854775808 / 0
9223372036854775807 / 18446744073709551615

4.2.1 tinyint類型

  1. 數值越界測試
mysql> create table tt1(num tinyint); Query OK, 0 rows affected (0.02 sec) mysql> insert into tt1 values(1); Query OK, 1 row affected (0.00 sec) mysql> insert into tt1 values(128); -- 越界插入,報錯 ERROR 1264 (22003): Out of range value for column 'num' at row 1 mysql> select * from tt1; | num | +-----+ | 1 | +-----+ 1 row in set (0.00 sec)
說明:在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。可以通過UNSIGNED來說明某個字段是無符號的。2. 無符號案例
mysql> create table tt2(num tinyint unsigned); mysql> insert into tt2 values(-1); -- 無符號,范圍是: 0 - 255 ERROR 1264 (22003): Out of range value for column 'num' at row 1 mysql> insert into tt2 values(255); Query OK, 1 row affected (0.02 sec) mysql> select * from tt2; | num | +-----+ | 255 | +-----+ 1 row in set (0.00 sec)
注意:盡量不使用unsigned,對于int類型可能存放不下的數據,int unsigned同樣可能存放不下,與其如此,還不如設計時,將int類型提升為bigint類型。

4.2.2 bit類型

  1. 基本語法:bit[(M)] :位字段類型。M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。
  2. 舉例
mysql> create table tt4 ( id int, a bit(8)); Query OK, 0 rows affected (0.01 sec) mysql> insert into tt4 values(10, 10); Query OK, 1 row affected (0.01 sec) mysql> select * from tt4; #發現很怪異的現象,a的數據10沒有出現 | id | a | +----+---+ | 10 | | +----+---+ 1 row in set (0.00 sec)
  1. 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

4.2.3 小數類型

4.2.3.1 float
  1. 語法:float[(m, d)] [unsigned] :M指定顯示長度,d指定小數位數,占用空間4個字節。
  2. 案例:小數float(4,2)表示的范圍是 -99.99 ~ 99.99,MySQL在保存值時會進行四舍五入。
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)如果是一個有符號的,則表示范圍是 -99.99 ~ 99.99,如果float(6,3),請同學們說說范圍是多少?3. 案例:如果定義的是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)
4.2.3.2 decimal
  1. 語法:decimal(m, d) [unsigned] :定點數m指定長度,d表示小數點的位數。
  2. decimal(5,2) 表示的范圍是 -999.99 ~ 999.99;decimal(5,2) unsigned 表示的范圍0 ~ 999.99。
  3. decimal和float很像,但是有區別:float和decimal表示的精度不一樣。
  4. 存在精度損失, 只不過相比于 float 來說精度更高.
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 +-----+-----------+-----------+
說明:float表示的精度大約是7位。decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0。如果m被省略, 默認是10
建議:如果希望小數的精度高,推薦使用decimal。

4.3 字符串類型

4.3.1 char

  1. 語法:char(L) :固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255。
  2. 案例(char)
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

4.3.2 varchar

  1. 語法:varchar(L) :可變長度字符串,L表示字符長度,最大長度65535個字節。
  2. 案例
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 - 3個字節用于記錄數據大小,所以說有效字節數是65532。當我們的表的編碼是utf8時,varchar(n)的參數n最大值是65532 / 3 = 21844[因為utf8中,一個字符占用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)

4.3.3 char和varchar比較

實際存儲
char(4)
varchar(4)
char占用字節
varchar占用字節
abcd
abcd
abcd
4 * 3 = 12
4 * 3 + 1 = 13
A
A
A
4 * 3 = 12
1 * 3 + 1 = 4
Abcde
×
×
數據超過長度
數據超過長度
如何選擇定長或變長字符串?
  • 如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5。
  • 如果數據長度有變化,就使用變長(varchar),比如:名字,地址,但是你要保證最長的能存得進去。
  • 定長的磁盤空間比較浪費,但是效率高。
  • 變長的磁盤空間比較節省,但是效率低。
  • 定長的意義是,直接開辟好對應的空間。
  • 變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少。

4.4 日期和時間類型

常用的日期有如下三個:
  • date :日期'yyyy - mm - dd' ,占用三字節。
  • datetime :時間日期格式 'yyyy - mm - dd HH:ii:ss' 表示范圍從1000到9999 ,占用八字節。
  • timestamp :時間戳,從1970年開始的 yyyy - mm - dd HH:ii:ss 格式和datetime完全一致,占用四字節。
案例
  1. 創建表
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp); Query OK, 0 rows affected (0.01 sec)
  1. 插入數據
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 | --添加數據時,時間戳自動補上當前時間 +------------+--------------------+--------------------+
  1. 更新數據
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 | -- 更新數據,時間戳會更新成當前時間 +------------+--------------------+--------------------+

4.5 enum和set

  1. 語法
  • enum:枚舉,“單選”類型;enum('選項1','選項2','選項3',...)。該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,....最多65535個;當我們添加枚舉值時,也可以添加對應的數字編號。
  • set:集合,“多選”類型;set('選項值1','選項值2','選項值3', ...)。該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值;而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,....最多64個。說明:不建議在添加枚舉值、集合值的時候采用數字的方式,因為不利于閱讀。
  1. 案例:有一個調查表votes,需要調查人的喜好,比如(登山,游泳,籃球,武術)中去選擇(可以多選),(男,女)[單選]。
mysql> create table votes( -> username varchar(30), -> hobby set('登山','游泳','籃球','武術'), --注意:使用數字標識每個愛好的時候,想想Linux權限,采用比特位位置來和set中的愛好對應起來 -> gender enum('男','女')); --注意:使用數字標識的時候,就是正常的數組下標 Query OK, 0 rows affected (0.02 sec)
  1. 插入數據
insert into votes values('雷鋒', '登山,武術', '男'); insert into votes values('Juse','登山,武術',2);
  1. 查詢數據
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 | 登山 | 男 |
不能查詢出所有愛好為登山的人。5. 集合查詢使用 find_in_set 函數:find_in_set(sub,str_list) :如果sub在str_list中,則返回下標;如果不在,返回0;str_list用逗號分隔的字符串。
mysql> select find_in_set('a', 'a,b,c');
結果:
| find_in_set('a', 'a,b,c') | | 1 |
mysql> select find_in_set('d', 'a,b,c');
結果:
| find_in_set('d', 'a,b,c') | | 0 |
查詢愛好登山的人:
mysql> select * from votes where find_in_set('登山', hobby);
結果:
| username | hobby | gender | | 雷鋒 | 登山,武術 | 男 | | Juse | 登山,武術 | 女 | | LiLei | 登山 | 男 |
對于 enum(枚舉, 單選) 和 set(集合, 多選) 可以用 數字進行篩選.

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

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

相關文章

設計模式-2 結構型模式

一、代理模式 1、舉例 海外代購 2、代理基本結構圖 3、靜態代理 1、真實類實現一個接口,代理類也實現這個接口。 2、代理類通過真實對象調用真實類的方法。 4、靜態代理和動態代理的區別 1、靜態代理在編譯時就已經實現了,編譯完成后代理類是一個實際…

vue+element-ui一個頁面有多個子組件組成。子組件里面有各種表單,實現點擊enter實現跳轉到下一個表單元素的功能。

一個父組件里面是有各個子組件的form表單組成的。 我想實現點擊enter。焦點直接跳轉到下一個表單元素。 父組件就是由各個子組件構成 子組件就像下圖一樣的都有個el-form的表單。 enterToTab.js let enterToTab {}; (function() {// 返回隨機數enterToTab.addEnterListener …

Open SSL 3.0相關知識以及源碼流程分析

Open SSL 3.0相關知識以及源碼流程分析 編譯 windows環境編譯1、工具安裝 安裝安裝perl腳本解釋器、安裝nasm匯編器(添加到環境變量)、Visual Studio編譯工具 安裝dmake ppm install dmake # 需要過墻2、開始編譯 # 1、找到Visual Studio命令行編譯工具目錄 或者菜單欄直接…

【Redis】筆記|第5節|Redisson實現高并發分布式鎖核心源碼

一、加鎖流程 1. 核心方法調用鏈 RLock lock redisson.getLock("resource"); lock.lock(); // 阻塞式加鎖? lockInterruptibly()? tryAcquire(-1, leaseTime, unit) // leaseTime-1表示啟用看門狗? tryAcquireAsync()? tryLockInnerAsync() // 執行Lua腳本 2…

基于React + TypeScript構建高度可定制的QR碼生成器

前言 在現代Web應用中,QR碼已成為連接線上線下的重要橋梁。本文將詳細介紹如何使用React TypeScript Vite構建一個功能強大、高度可定制的QR碼生成器,支持背景圖片、文本疊加、HTML模塊、圓角導出等高級功能。 前往試試 項目概述 技術棧 前端框架:…

【MATLAB代碼】制導——三點法,二維平面下的例程|運動目標制導,附完整源代碼

三點法制導是一種導彈制導策略,主要用于確保導彈能夠準確追蹤并擊中移動目標。該方法通過計算導彈、目標和制導站之間的相對位置關系,實現對目標的有效制導。 本文給出MATLAB下的三點法例程,模擬平面上捕獲運動目標的情況訂閱專欄后可直接查看源代碼,粘貼到MATLAB空腳本中即…

Ubuntu22.04 安裝 IsaacSim 4.2.0

1. 從官網下載 IsaacSim 4.2.0 安裝包 https://download.isaacsim.omniverse.nvidia.com/isaac-sim-standalone%404.2.0-rc.18%2Brelease.16044.3b2ed111.gl.linux-x86_64.release.zip 2. 查閱 Workstation Installation 安裝方式 Workstation Installation — Isaac Sim Do…

開源量子模擬引擎:Quantum ESPRESSO本地部署教程,第一性原理計算輕松入門!

一、介紹 Quantum ESPRESSO 是一個用于電子結構計算和納米尺度材料建模的開源計算機代碼集成套件,專門用于進行第一性原理(第一性原理)計算,涵蓋了電子結構、晶體學和材料性能的模擬。 Quantum ESPRESSO GPU 版本支持GPU加速&am…

PVE 虛擬機安裝 Ubuntu Server V24 系統 —— 一步一步安裝配置基于 Ubuntu Server 的 NodeJS 服務器詳細實錄1

前言 最近在基于 NodeJS V22 寫一個全棧的項目,寫好了,當然需要配置服務器部署啦。這個過程對于熟手來說,還是不復雜的,但是對于很多新手來說,可能稍微有點困難。所以,我把整個過程全部記錄一下。 熟悉我…

【JUC】深入解析 JUC 并發編程:單例模式、懶漢模式、餓漢模式、及懶漢模式線程安全問題解析和使用 volatile 解決內存可見性問題與指令重排序問題

單例模式 單例模式確保某個類在程序中只有一個實例,避免多次創建實例(禁止多次使用new)。 要實現這一點,關鍵在于將類的所有構造方法聲明為private。 這樣,在類外部無法直接訪問構造方法,new操作會在編譯…

2. 庫的操作

2.1 創建數據庫 語法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name # 字符集: 存儲編碼 [DEFAULT] COLLATE collation_name # 校驗集: 比較/選擇/讀…

道可云人工智能每日資訊|北京農業人工智能與機器人研究院揭牌

道可云人工智能&元宇宙每日簡報(2025年6月3日)訊,今日人工智能&元宇宙新鮮事有: 北京農業人工智能與機器人研究院揭牌 5月30日,北京市農業農村局、北京市海淀區人民政府、北京市農林科學院共同主辦北京農業人…

【JSON-to-Video】設置背景視頻片斷

目錄 設置bgVideo字段 1. 設置bgVideo.videoList字段 2. 設置randomPlay字段 3. 設置complete字段 4. 調用API,制作視頻 歡迎來到JSON轉視頻系列教程。今天要教大家如何添加背景視頻片斷,在視頻制作中,巧妙運用背景視頻,能為…

星閃開發之Server-Client 指令交互控制紅燈亮滅案例解析(SLE_LED詳解)

系列文章目錄 星閃開發之Server-Client 指令交互控制紅燈亮滅的全流程解析(SLE_LED詳解) 文章目錄 系列文章目錄前言一、項目地址二、客戶端1.SLE_LED_Client\inc\SLE_LED_Client.h2.SLE_LED_Client\src\SLE_LED_Client.c頭文件與依賴管理宏定義與全局變…

Linux shell練習題

Shell 1. 判斷~/bigdata.txt 是否存在,若已存在則打印出”該文件已存在“,如不存在,則輸出打印:”該文件不存在“ if [ -f ./bigdata.txt ];then echo "文件存在" else echo "文件不存在" fi2. 判斷~/bigd…

Linux基本指令(三)

接上之前的文章,咱繼續分享Linux的基本指令,Linux指令比較多,很難全部記住需要做筆記對常用的指令進行記錄,方便以后復習查找,做筆記也可以對知識理解更加深刻。 目錄 時間相關指令 date顯示 時間戳 cal指令 ?編…

WebRTC中sdp多媒體會話協議報文詳細解讀

sdp介紹 在WebRTC(Web實時通信)中,SDP(Session Description Protocol)是用來描述和協商多媒體會話的協議。它定義了會話的參數和媒體流的信息,如音視頻編碼格式、傳輸方式、網絡地址等。SDP是WebRTC中一個…

【MySQL】 約束

一、約束的定義 MySQL 約束是用于限制表中數據的規則,確保數據的 準確性 和 一致性 。約束可以在創建表時定義,也可以在表創建后通過修改表結構添加。 二、常見的約束類型 2.1 NOT NULL 非空約束 加了非空約束的列不能為 NULL 值,如果可以…

【.net core】【watercloud】樹形組件combotree導入及調用

源碼下載:combotree: 基于layui及zTree的樹下拉框組件 鏈接中提供了組件的基本使用方法 框架修改內容 1.文件導入(路徑可更具自身情況自行設定) 解壓后將文件夾放在圖示路徑下,修改文件夾名稱為combotree 2.設置路徑(設置layu…

ES101系列07 | 分布式系統和分頁

本篇文章主要講解 ElasticSearch 中分布式系統的概念,包括節點、分片和并發控制等,同時還會提到分頁遍歷和深度遍歷問題的解決方案。 節點 節點是一個 ElasticSearch 示例 其本質就是一個 Java 進程一個機器上可以運行多個示例但生產環境推薦只運行一個…