【MySQL數據庫】數據類型詳解

目錄

  • 數據類型
  • tinyint類型(整形)
  • bit類型
  • 小數
    • 浮點數 float、double
    • decimal
  • 字符串類型
    • char
    • varchar
    • char與varchar的比較
  • 日期時間類型
  • enum和set
  • 總結

數據類型

在這里插入圖片描述

tinyint類型(整形)

例:

mysql> create table tt1(num tinyint);mysql> insert  into tt1 values(1);mysql> insert  into tt1 values(128); -- 越界插入,報錯
ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> select * from tt1;+------+| num  |+------+|  1   |+------+1 row in set (0.00 sec)
  • 在MySQL中,整型可以指定是有符號的和無符號的,默認是有符號的。
  • 可以通過UNSIGNED來說明某個字段是無符號的
 mysql> create table tt2(num tinyint unsigned);mysql> insert into tt2 values(-1); -- 無符號,范圍是: 0 - 255ERROR 1264 (22003): Out of range value for column 'num' at row 1mysql> 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)

bit類型

bit[(M)]

位字段類型

M表示每個值的位數,范圍從1到64。如果M被忽略,默認為1。

  • bit字段在顯示時,是按照ASCII碼對應的值顯示。
 mysql> insert into tt4 values(65, 65);mysql> select * from tt4;+------+------+| id   | a    |+------+------+|   10 |      |   |   65 | A    |+------+------+

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

小數

浮點數 float、double

float[(m, d)] [unsigned]

M指定顯示長度

d指定小數位數,占用空間4個字節

  • 如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)
  • double與float類似,只是精度更高,占8字節

decimal

decimal(m, d) [unsigned]

定點數m指定長度,d表示小數點的位數

  • 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);mysql> create table tt8 ( id int, salary float(10,8), salary2  decimal(10,8));mysql> select * from tt8;+------+-------------+-------------+
| id   | salary      | salary2     |
+------+-------------+-------------+
|  100 | 23.12345695 | 23.12345612 |
+------+-------------+-------------+
  • float表示的精度大約是7位
  • decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0.如果m被省略,默認是10
  • 如果希望小數的精度高,可以使用decimal

字符串類型

char

char(L): 

固定長度字符串,L是可以存儲的長度,單位為字符,最大長度值可以為255

  • 注意:MySQL中的字符和我們在語言中學的字符是不一樣的,語言中的字符指的是一個字節的數據,但MySQL中的字符就真的代表一個字符,無論你是‘a’還是‘中’,都是一個字符
 mysql> create table tt9(id int, name char(2));mysql> insert into tt9 values(100, 'ab');mysql> insert into tt9 values(101, '中國');mysql> insert into tt9 values(101, '中');mysql> select * from tt9;
+------+--------+
| id   | name   |
+------+--------+
|  100 | ab     |
|  101 | 中國   |
|  101 ||
+------+--------+

varchar

varchar(L)

可變長度字符串

L表示字符長度,最大長度65535個字節,注意單位是字節,char,單位是字符

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 | 我愛你,中國         |+------+--------------------+ 

char與varchar的比較

  • char是定長的,你定義多長他就會分配多大的空間
  • varchar是可變的,你定義的只是它的上限,實際上它的空間會根據的數據的大小而變化,也就是給多少用多少

那在平時我們該如何選擇使用哪一種呢?

  • 定長的磁盤空間比較浪費,但是效率高。
  • 變長的磁盤空間比較節省,但是效率低。

所以,如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5

如果數據長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去。

在這里插入圖片描述

日期時間類型

date

‘yyyy-mm-dd’ ,占用三字節

datetime 

時間日期格式
‘yyyy-mm-dd HH:ii:ss’
表示范圍從1000 到 9999 ,占用八字節

timestamp

時間戳,從1970年開始
yyyy-mm-dd HH:ii:ss
格式和datetime 完全一致,占用四字節

  • timetamp 在使用時會自動更新,其他兩個需要外部插入
//建表
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: 0mysql> 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(‘選項1’,‘選項2’,‘選項3’,…);
多選一類型

該設定只是提供了若干個選項的值,最終一個單元格中,實際只存儲了其中一個值

而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,3,…最多65535個;

當我們添加枚舉值時,也可以添加對應的數字編號。

set

集合,“多選”類型;
set(‘選項值1’,‘選項值2’,‘選項值3’, …);

該設定只是提供了若干個選項的值,最終一個單元格中,設計可存儲了其中任意多個值

而且出于效率考慮,這些值實際存儲的是“數字”,因為這些選項的每個選項值依次對應如下數字:1,2,4,8,16,32,… 最多64個。

  • enum中只能插入枚舉類型中的數據,不能插入枚舉類型沒有的數據,字符或下標(從1開始)插入都行

  • set同樣也只能插入原有的數據,不過可以選擇單個或者多個一起插入

  • 注意,enum中可以使用下標插入,但是set中是以位圖的方式插入的,如:2的二進制為00010,所以我們插入的是第二個數據

  • 數據可以為NULL,也可以是空串

下面是一個調查表實例,調查人的喜好與性別:

mysql> create table votes(-> username varchar(30),
-> hobby 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     | 登山,武術      ||+----------+---------------+--------+

查詢篩選語句:

1.enum

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

2.set
find_ in_ set函數

在一個集合中查找某一個元素是否存在,返回值為對應的下標

mysql> select find_in_set('a', 'a,b,c');mysql> select find_in_set('a', 'a,b,c');+---------------------------+| find_in_set('a', 'a,b,c') |+---------------------------+|                         1 |+---------------------------+

所以我們查找時可以用該函數的返回值充當where的判斷值

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

找多個

mysql> select * from votes where find_in_set('登山', hobby) and find_in_set('羽毛球', hobby);

總結

其實數據類型就是MySQL中的一種天然的約束,滿足就可以插入

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

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

相關文章

咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包

咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包(內有教程) 刷機教程簡單說明: 1、把下載好的刷機包,U盤里建立一個upgrade文件夾,固件放入此文件夾里,放入U盤中,注意升級包為壓縮包不要對…

CS61A:STRING REPRESENTATION

Python 規定所有對象都應該產生兩種不同的字符串表示形式:一種是人類可解釋的文本,另一種是 Python 可解釋的表達式。字符串的構造函數 str 返回一個人類可讀的字符串。在可能的情況下,repr 函數會返回一個計算結果相等的 Python 表達式。rep…

LangChain緩存嵌入技術完全指南:CacheBackedEmbedding原理與實踐(附代碼示例)

一、嵌入緩存技術背景與應用場景 1.1 為什么需要嵌入緩存? 算力消耗問題:現代嵌入模型(如text-embedding-3-small)單次推理需要約0.5-1秒/文本 資源浪費現狀:實際業務中約30%-60%的文本存在重復計算 成本壓力&#…

精益數據分析(3/126):用數據驅動企業發展的深度解析

精益數據分析(3/126):用數據驅動企業發展的深度解析 大家好!一直以來,我都堅信在當今競爭激烈的商業環境中,數據是企業獲得競爭優勢的關鍵。最近深入研究《精益數據分析》這本書,收獲頗豐&…

wpf ScaleTransform

在WPF中,ScaleTransform是用于實現元素縮放的核心類,屬于System.Windows.Media命名空間下的變換類型。以下是其主要特性與使用方式的總結: ?核心屬性? ?縮放比例? ScaleX:水平方向縮放比例(默認1.0,即…

用純Qt實現GB28181協議/實時視頻/云臺控制/預置位/錄像回放和下載/事件訂閱/語音對講

一、前言 在技術的長河中探索,有些目標一旦確立,便如同璀璨星辰,指引著我們不斷前行。早在2014年,我心中就種下了用純Qt實現GB28181協議的種子,如今回首,一晃十年已逝,好在整體框架和邏輯終于打…

0x01、Redis 主從復制的實現原理是什么?

Redis 主從復制概述 Redis 的主從復制是一種機制,允許一個主節點(主實例)將數據復制到一個或多個從節點(從實例)。通過這一機制,從節點可以獲取主節點的數據并與之保持同步。 復制流程 開始同步&#xf…

整活 kotlin + springboot3 + sqlite 配置一個 SQLiteCache

要實現一個 SQLiteCache 也是很簡單的只需要創建一個 cacheManager Bean 即可 // 如果配置文件中 spring.cache.sqlite.enable false 則不啟用 Bean("cacheManager") ConditionalOnProperty(name ["spring.cache.sqlite.enable"], havingValue "t…

深入探索如何壓縮 WebAssembly

一、初始體積:默認 Release 構建 我們從最基礎的構建開始,不開啟調試符號,僅使用默認的 release 模式: $ wc -c pkg/wasm_game_of_life_bg.wasm 29410 pkg/wasm_game_of_life_bg.wasm這是我們優化的起點 —— 29,410 字節。 二…

多角度分析Vue3 nextTick() 函數

nextTick() 是 Vue 3 中的一個核心函數,它的作用是延遲執行某些操作,直到下一次 DOM 更新循環結束之后再執行。這個函數常用于在 Vue 更新 DOM 后立即獲取更新后的 DOM 狀態,或者在組件渲染完成后執行某些操作。 官方的解釋是,當…

前端面試-自動化部署

基礎概念 什么是CI/CD?在前端項目中如何應用?自動化部署相比手動部署有哪些優勢?常見的自動化部署工具有哪些?舉例說明它們的區別(如Jenkins vs GitHub Actions)。如何通過Git Hook實現自動化部署&#xf…

架構生命周期(高軟57)

系列文章目錄 架構生命周期 文章目錄 系列文章目錄前言一、軟件架構是什么?二、軟件架構的內容三、軟件設計階段四、構件總結 前言 本節講明架構設計的架構生命周期概念。 一、軟件架構是什么? 二、軟件架構的內容 三、軟件設計階段 四、構件 總結 就…

GPTNet如何革新創意與效率

引言 人工智能正在以前所未有的速度改變我們的工作與生活方式,從智能寫作到視覺創作,AI工具已成為不可或缺的伙伴。在眾多平臺中,GPTNet以其強大的功能整合和直觀體驗嶄露頭角。它不僅匯集了GPT系列、Claude、Grok、Gemini等頂級對話模型&am…

【計網】SSL/TLS核心原理

序言 在HTTP協議中,信息是明文傳輸的,因此為了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)協議。HTTPS也是一種超文本傳送協議,在HTTP的基礎上加入了SSL/TLS協議,SSL/TLS依靠證書來驗證服務端的…

Web Components 開發與集成

以下是關于 Web Components 開發與集成 的系統知識梳理,涵蓋核心概念、高級特性、集成與優化等內容: 一、Web Components 核心概念 技術作用核心 APICustom Elements定義可復用的自定義 HTML 元素customElements.define()、生命周期鉤子(connectedCallback 等)Shadow DOM封…

day26 學習筆記

文章目錄 前言一、圖像顏色轉換1.HSV顏色空間2.顏色轉換 二、灰度化1.最大值法2.平均值法3.加權均值法 三、二值化1.全局閾值法1.閾值法(THRESH_BINARY)2.反閾值法(THRESH_BINARY_INV)3.截斷閾值法(THRESH_TRUNC)4.低閾值零處理(THRESH_TOZERO)5.超閾值零處理(THRESH_TOZERO_IN…

威鋒VL822-Q7T10GHUB芯片適用于擴展塢顯示器

一、概述 VL822-Q7T是VIA Lab(威盛電子旗下專注于USB相關技術研發的子公司)精心打造的一款高性能USB 3.1 Gen2集線器控制器芯片。在當今數字化時代,USB接口作為設備連接與數據傳輸的核心通道,其性能與穩定性至關重要。VL822-Q7T憑…

華為OD機試真題——最小的調整次數/特異性雙端隊列(2025A卷:100分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 100分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《最小的調…

關于 Spring Boot 微服務解決方案的對比,并以 Spring Cloud Alibaba 為例,詳細說明其核心組件的使用方式、配置及代碼示例

以下是關于 Spring Boot 微服務解決方案的對比,并以 Spring Cloud Alibaba 為例,詳細說明其核心組件的使用方式、配置及代碼示例: 關于 Spring Cloud Alibaba 致力于提供微服務開發的一站式解決方案! https://sca.aliyun.com/?spm7145af80…

常見的爬蟲算法

1.base64加密 base64是什么 Base64編碼,是由64個字符組成編碼集:26個大寫字母AZ,26個小寫字母az,10個數字0~9,符號“”與符號“/”。Base64編碼的基本思路是將原始數據的三個字節拆分轉化為四個字節,然后…