目錄
- 字符編碼與組態檔
- \s查看MySQL相關資訊
- 修改組態檔my-default.ini
- 解決5.6版本字符編碼問題
- 組態檔什么時候加載?
- 偷懶操作:輸入mysql直接登錄root賬戶
- 資料庫存盤引擎
- 存盤引擎簡介
- 查看引擎 show engines;
- 需要了解的四個存盤引擎
- 了解不同存盤引擎底層檔案個數
- 驗證memory\blackhole 資料消失
- 創建表的完整語法(重要)
- 欄位型別之整型
- 驗證整型默認是否攜帶正負號
- 取消正負號
- 嚴格模式
- 查看當前資料庫是否有嚴格模式
- 臨時修改
- 永久修改
- 欄位型別之浮點型
- 欄位型別之字符型別(重要)
- 驗證定長和變長
- 取消mysql自動去掉空格的特性
- char VS varchar
- 為什么varchar的存取速度慢?
- 補充
- 驗證定長和變長
- int型別中數字的含義
- 欄位型別之列舉與集合
- 列舉
- 集合
- 欄位型別之日期型別
字符編碼與組態檔
\s查看MySQL相關資訊
相關資訊有:當前用戶、版本、編碼、埠號
MySQL5.6及之前的版本編碼需要人為統一 之后的版本已經全部默認統一
如果想要永久修改編碼配置 需要操作組態檔my-default.ini

注意事項:
- mysql默認埠號3306 當重復起mysql服務端時 記得查看埠號
- MySQL5.6版本及之前的版本 編碼既有拉丁文 也有gbk 需要人為統一
MySQL5.6版本之后的MySQL編碼已經統一
修改組態檔my-default.ini
2.默認的組態檔是my-default.ini
拷貝上述檔案并重命名為my.ini
直接拷貝字符編碼相關配置即可無需記憶
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
ps:
1.utf8mb4能夠存盤表情 功能更強大
2.utf8與utf-8是有區別的 MySQL中只有utf8
修改了組態檔中關于[mysqld]的配置 需要重啟服務端
"""
利用組態檔我們可以偷懶
將管理員登錄的賬號密碼直接寫在組態檔中 之后使用mysql登錄即可
[mysql]
user='root'
password=123
"""
解決5.6版本字符編碼問題
- 組態檔位置

- 查看組態檔介紹:

- 拷貝一份并重命名為
my.ini這個名字不能隨便取,放在旁邊(注意打開檔案擴展名)

- 在my.ini檔案里修改配置資訊

- 重啟服務端(注意使用管理員cmd)

- 修改成功

補充說明:
1. mysql中'utf8'和'utf-8'這兩個是有區別的:mysql中只允許有utf8.
2. [client]表示第三方的客戶端 [mysql]表示自己寫的客戶端 [server]表示服務端.
3. 如果是8.0版本的mysql,則默認編碼是utfmb4.
組態檔什么時候加載?
在mysqld的組態檔中加一串不明所以的代碼

重啟服務端,登錄mysql:

會直接報錯 連密碼都輸不進去了,所以說組態檔是在客戶端啟動之前加載的,
偷懶操作:輸入mysql直接登錄root賬戶
修改組態檔:

實作不輸入密碼直接登錄,原來是賬號密碼寫組態檔里了:

資料庫存盤引擎
存盤引擎簡介
資料庫針對資料采取的多種存取方式
舉例:
不同的引擎針對相同的資料 采取的方式不一樣
給小勇,小紅一份資料:
小勇 ---> 存電腦 取的時候:小勇乖乖拿過來
小紅 ----> 存網盤 取的時候:小紅叫我過來拿
查看引擎 show engines;
在mysql中使用show engines;命令查看引擎:

表格從左到右 ---> 引擎 模式 描述 事務 斷點
事務:當兩個不同的資料庫互動時 例如小紅轉賬時 銀行癱瘓 只扣錢沒加錢 事務可以讓時間倒流
需要了解的四個存盤引擎
-
MyISAM
MySQL5.5之前默認的存盤引擎
存取資料的速度快 但是功能較少 安全性較低
myisam 不支持事務 行鎖表鎖 -
InnoDB
MySQL5.5之后默認的存盤引擎
支持事務、行鎖、外鍵等操作 存取速度沒有MyISAM快 但是安全性更高 -
Memory
基于記憶體存取資料 僅用于臨時表資料存取
基于hash 默認不持久保存 -
BlackHole
任何寫入進去的資料都會立刻丟失
備份時資料的處理
了解不同存盤引擎底層檔案個數
查看表的存盤引擎:

了解不同存盤引擎底層檔案個數
create database db2;
use db2;
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
'''
1.innodb兩個檔案
.frm 表結構
.ibd 表資料(表索引)
2.myisam三個檔案
.frm 表結構
.MYD 表資料
.MYI 表索引
3.memory一個檔案
.frm 表結構
4.blackhole一個檔案
.frm 表結構
'''
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
'''
表索引相當于書的目錄 用于加快資料查詢
memery 基于記憶體所以沒有表資料 檔案是作業系統暴露出來給用戶操作硬碟的快捷方式'''
ps:MySQL默認忽略大小寫
- 創建表:

- 查看檔案:

驗證memory\blackhole 資料消失
t3 重啟服務資料消失:

t4 資料直接消失:

創建表的完整語法(重要)
'''
create table 表名(
欄位名 欄位型別(數字) 約束條件,
欄位名 欄位型別(數字) 約束條件,
欄位名 欄位型別(數字) 約束條件
);
'''
1.欄位名和欄位型別是必須的
2.數字和約束條件是可選的
3.約束條件也可以寫多個 空格隔開即可
4.'''最后一行結尾不能加逗號'''
ps:撰寫SQL陳述句報錯之后不要慌 仔細查看提示 會很快解決
near ')' at line 7
欄位型別之整型
tinyint 1bytes 正負號(占1bit)
smallint 2bytes 正負號(占1bit)
int 4bytes 正負號(占1bit)
bigint 8bytes 正負號(占1bit)

驗證整型默認是否攜帶正負號
create table t5(id tinyint);
insert into t5 values(-129),(128);
- 創建表

- 插入值

結果是-128和127 也就意味著默認自帶正負號
正負數也要占用一個bit位 故只能存128
手機號(13位)存盤時,Int的位數不夠(10位) 需要使用bigint、字串,
取消正負號
我們也可以取消正負號,使用約束條件unsigned.
create table t6(id tinyint unsigned);
insert into t6 values(-129),(128),(1000);

嚴格模式
當我們在使用資料庫存盤資料的時候 如果資料不符合規范
應該直接報錯而不是擅自修改資料 這樣會導致資料的失真(沒有實際意義)
正常情況下是應該報錯 但是我們之前修改了組態檔 將嚴格模式的配置代碼給刪掉了
查看當前資料庫是否有嚴格模式
代碼的意思是找出所有帶mode的配置資訊:
show variables like '%mode%';

這表示沒有開啟嚴格模式
臨時修改
set session sql_mode='strict_trans_tables';
在當前客戶端有效 當前用戶有效 用戶退出之后重新登錄無效
set global sql_mode='strict_trans_tables';
在當前服務端有效 只要服務器沒重啟 對所有用戶都有效

永久修改
改組態檔:
sql mode = STRICT TRANS TABLES

欄位型別之浮點型
語法:
float (存盤數字的位數,小數點后面的數)
float(20,10)
總共存盤20位數 小數點后面占10
double(20,10)
總共存盤20位數 小數點后面占10
decimal(20,10)
總共存盤20位數 小數點后面占10
create table t7(id float(60,20));
create table t8(id double(60,20));
create table t9(id decimal(60,20));
insert into t7 values(1.11111111111111111111);
insert into t8 values(1.11111111111111111111);
insert into t9 values(1.11111111111111111111);
三者的核心區別在于精確度不同
float < double < decimal

驗證三者精確度:

欄位型別之字符型別(重要)
char
定長
char(4) 最多存盤四個字符 超出就報錯 不夠四個空格填充至四個
varchar
變長
varchar(4) 最多存盤四個字符 超出就報錯 不夠則有幾位存幾位
create table t10(id int, name char(4));
create table t11(id int, name varchar(4));
insert into t10 values(1, 'jason1');
insert into t11 values(1, 'jason2');
ps:char_length()獲取欄位存盤的資料長度
默認情況下MySQL針對char的存盤會自動填充空格和洗掉空格
數字限制存盤的字符長度:

驗證定長和變長
- 建立表:

- 使用char_length()查看字符長度

- 大失所望:char怎么沒有填充空白?
mysql存的時候真的是有空格 取出的時候會將空格去掉
所以還是1 可以取消這個機制 但是沒必要取消
取消mysql自動去掉空格的特性
輸入:
set global sql_mode='strict_trans_tables,pad_char_to_full_length';
注意這修改的是服務端層面,重啟服務端則失效,

重新登錄:

char VS varchar
char
優勢:整存整取 速度快
劣勢:浪費存盤空間
varchar
優勢:節省存盤空間
劣勢:存取資料的速度較char慢
"""
char與varchar的使用需要結合具體應用場景
char(32)存中國人名字 劣勢 因為大多數人名字都是兩三個字 少部分人名字長
存姓名 用varchar
存手機號碼 男女性別 用char
"""
為什么varchar的存取速度慢?
# 為什么varchar存取速度較慢?
char取固定位數 直接拿就好了
jasonjacktomjerry 不知道存的時候是幾位
不知道要取幾位的時候 使用報頭
存資料時用1bytes作為報頭
取的時候先取一個位元組的報頭 決議資料真實的長度:
1bytes+jack 1bytes+tony 1bytes+jason 1bytes+kevin 1bytes+tom 1bytes+jerry
報頭1bytes不夠用怎么辦?
補充

int型別中數字的含義
數字在很多地方都是用來表示限制存盤資料的長度
但是在整型中數字卻不是用來限制存盤長度
- 不是用來限制存盤長度:
create table t12(id int(3));
insert into t12 values(12345);

- 而是用來控制展示的長度:
create table t13(id int(5) zerofill);
insert into t13 values(123),(123456789);
create table t14(id int);

3.以后寫整型無需添加數字,會默認添加數字

欄位型別之列舉與集合
列舉
多選一
create table t15(
id int,
name varchar(32),
gender enum('male','female','others')
);
insert into t15 values(1,'tony','猛男');
insert into t15 values(2,'jason','male');
insert into t15 values(3,'kevin','others');
- 給表添加列舉型別

- 欄位不對:

- 添加成功

集合
集合包括列舉!
多選多(多選一)
create table t16(
id int,
name varchar(16),
hobbies set('basketabll','football','doublecolorball')
);
insert into t16 values(1,'jason','study');
insert into t16 values(2,'tony','doublecolorball');
insert into t16 values(3,'kevin','doublecolorball,football');
- 給表添加集合型別

- 無法輸入集合外的資料

欄位型別之日期型別
datetime 年月日時分秒
date 年月日
time 時分秒
year 年
create table t17(
id int,
name varchar(32),
register_time datetime,
birthday date,
study_time time,
work_time year
);
insert into t17 values(1,'jason','2000-11-11 11:11:11','1998-01-21','11:11:11','2000');
ps:以后涉及到日期相關欄位一般都是系統自動回去 無需我們可以操作
'''
以后所有的表都要用日期型別
datatime可以切割 想怎么切怎么切 用mysql內置函式 流程控制'''
- 添加時間型別

- 給時間型別添加值

更多:

關于 DATETIME 與 TIMESTAMP 兩種型別如何選用,可以按照存盤需求來,比如要求存盤范圍更廣,則推薦使用 DATETIME ,如果只是存盤當前時間戳,則可以使用 TIMESTAMP 型別,不過值得注意的是,TIMESTAMP 欄位資料會隨著系統時區而改變但 DATETIME 欄位資料不會,總體來說 DATETIME 使用范圍更廣,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/538218.html
標籤:MySQL
