字元編碼與配置文件 \s查看MySQL相關信息 相關信息有:當前用戶、版本、編碼、埠號 MySQL5.6及之前的版本編碼需要人為統一 之後的版本已經全部預設統一 如果想要永久修改編碼配置 需要操作配置文件my-default.ini 註意事項: mysql預設埠號3306 當重覆起mysql服務 ...
目錄
字元編碼與配置文件
\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 使用範圍更廣。