[TOC] 第十六章、淺識資料庫 資料庫配置 資料庫修改信息 用戶操作 表的修改 創建表的完整語法 資料庫表的引擎:驅動數據的方式 資料庫優化 資料庫的模式 mysql支持的數據類型 整型 浮點型 字元串:資料庫優化 char效率要高於varchar 時間 枚舉與集合 約束 ...
目錄
第十六章、淺識資料庫
資料庫配置
# 通過配置文件統一配置的目的:統一管理 服務端(mysqld) 、客戶端(client)
# 配置了 mysqld(服務端) 的編碼為utf8,那麼再創建的資料庫,預設編碼都採用utf8
# 配置流程
# 1)在mysql安裝根目錄下,創建配置文件:my.ini
# mac下配置文件名叫 my.cnf
# 2)設置配置文件內容並保存
[mysqld] # 伺服器配置
port=3306 # 可以修改資料庫預設埠(如果資料庫埠被其他軟體占用)
character-set-server=utf8 # 編碼格式
collation-server=utf8_general_ci # 排序方式(預設跟編碼格式走)
[client] # mysql自己的客戶端叫[mysql],配置[client]即配置了[mysql],也配置了其他存在方式的客戶端,比如Navicat可視化客戶端
default-character-set=utf8 # 編碼格式
# 3)重啟資料庫服務
資料庫修改信息
# 修改字元編碼
mysql>: alter database 資料庫名 charset=編碼格式;
用戶操作
# 為特定的資料庫分配有該資料庫 操作許可權 的用戶
mysql>: grant 許可權們 on 資料庫.表 to 用戶名@'ip地址' identified by '密碼';
# 1)all:所有許可權
# 2)oldboy.*:oldboy資料庫下所有表
# 3)oldboy@'localhost':本機可以通過oldboy用戶登入
# 4)identified by 'Oldboy123':密碼為Oldboy123
eg>: grant all on oldboy.* to oldboy@'localhost' identified by 'Oldboy123';
# 1)select,delete,update,insert,drop,alter:指定的許可權
# 2)oldboy.*:oldboy資料庫下所有表
# 3)oldboy@'localhost':本機可以通過oldboy用戶登入
# 4)identified by 'Oldboy123':密碼為Oldboy123
eg>: grant select,delete,update,insert,drop,alter on oldboy.* to oldboy@'localhost' identified by 'Oldboy123';
表的修改
修改表名
mysql>: alter table 舊表 rename 新表;
修改欄位名
mysql>: alter table 表名 change 舊欄位 新欄位 類型(長度);
修改欄位屬性
mysql>: alter table 表名 modify 欄位 新類型(長度);
創建表的完整語法
mysql>: create table 表名 (
屬性名1 類型(長度) 約束,
...
屬性名n 類型(長度) 約束
) engine=引擎 default charset=utf8;
資料庫表的引擎:驅動數據的方式 - 資料庫優化
mysql>: create table t11(id int)engine=innodb;
mysql>: create table t12(id int)engine=myisam;
mysql>: create table t13(id int)engine=blackhole;
mysql>: create table t14(id int)engine=memory;
資料庫的模式
mysql 5.7 以後預設都是安全模式
mysql支持的數據類型
整型
'''類型
tinyint:1位元組 -128~127 *
smallint:2位元組 -32768 ~ 32767
mediumint:3位元組
int:4位元組 -2147483648~2147483647 *
bigint:8位元組
'''
'''約束 *
unsigned:無符號
zerofill:0填充
'''
# 建表
mysql>: create table tb1(x tinyint, y smallint, z int(6));
# 插入數據
mysql>: insert into tb1 values(128, 32768, 32768);
# 結果:127,32767,32768
# 結論:整型的長度由所占位元組(取值範圍)決定,可以自定義長度,但是不影響所占位元組(取值範圍)
# 所有整型變數的長度一般都省略不寫
# 整型約束
mysql>: create table tb2(x tinyint unsigned); # 0~255
mysql>: insert into tb2 values(256), (-1); # 255, 0
# 0填充約束
mysql>: create table tb3(x tinyint unsigned zerofill);
mysql>: insert into tb3 values(10); # 010
浮點型
'''類型
float:4位元組,3.4E–38~3.4E+38 *
double:8位元組,1.7E–308~1.7E+308
decimal:M,D大值基礎上+2
'''
'''寬度:
限制存儲寬度
(M, D) => M為位數,D為小數位
float(255, 30):精度最低,最常用
double(255, 30):精度高,占位多
decimal(65, 30):字元串存,全精度
'''
# 建表:
mysql>: create table tb4 (age float(256, 30)); # Display width out of range for column 'age' (max = 255)
mysql>: create table tb5 (age float(255, 31)); # Too big scale 31 specified for column 'age'. Maximum is 30.
mysql>: create table tb5 (age float(65, 30)); # 在合理取值範圍
create table t12 (x float(255, 30));
create table t13 (x double(255, 30));
create table t14 (x decimal(65, 30));
字元串:資料庫優化 - char效率要高於varchar
'''類型
char:定長
varchar:不定長
'''
'''寬度
限制存儲寬度
char(4):以4個字元存儲定長存儲數據
varchar(4):數據長度決定字元長度,為可變長度存儲數據
'''
# 建表:
mysql>: create table ts1 (s1 char(4), s2 varchar(4));
mysql>: insert into ts1 values('adcde', 'xyzabc');
時間
'''類型
year:yyyy(1901/2155)
date:yyyy-MM-dd(1000-01-01/9999-12-31)
time:HH:mm:ss
datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
timestamp:yyyy-MM-dd HH:mm:ss(1970-01-01 00:00:00/2038-01-19 ??)
'''
# 建表:
mysql>: create table td1 (my_year year, my_date date, my_time time);
mysql>: insert into td1 values(1666, '8888-8-8', '8:8:8'); # 時間需要在取值訪問內
mysql>: create table td2 (my_datetime datetime, my_timestamp timestamp);
mysql>: insert into td2 values('2040-1-1 1:1:1', '2040-1-1 1:1:1'); # 時間需要在取值訪問內
mysql>: insert into td2(my_datetime) values('2040-1-1 1:1:1'); # 時間需要在取值訪問內
枚舉與集合
# 枚舉與集合:為某一個欄位提供選項的 - 枚舉只能單選(1個),集合可以多選(0-n個)
# 建表
# enum、set預設值為NULL
mysql>: create table tc1 (name varchar(20), sex enum('男', '女', '哇塞'), hobbies set('男', '女', '哇塞'));
mysql>: insert into tc1 values('ruakei', '哇塞哇塞', '未知');
# enum、set手動設置預設值 '男' 與 '哇塞'
mysql>: create table tc2 (name varchar(20), sex enum('男', '女', '哇塞') default '男', hobbies set('男', '女', '哇塞') default '哇塞');
mysql>: insert into tc2 values('ruakei', '哇塞哇塞', '未知');
mysql>: insert into tc2(name) values('ruakei');
# 對sex、hobbies兩個欄位賦值錯誤,系統預設用空字元串填充(非安全模式),安全模式拋異常
# 如果對出sex、hobbies兩個欄位外的其他欄位進行賦值,這兩個欄位會才有預設值
# 註:對set類型的欄位進行賦值,用一個字元串,字元串內部用,將多個選項隔開,且不能添加空格等其他額外字元
mysql>: insert into tc2 values('ruakei_1', '女', '男,女,哇塞');
約束
"""
primary key:主鍵,唯一標識,表都會擁有,不設置為預設找第一個 不空,唯一 欄位,未標識則創建隱藏欄位
foreign key:外鍵
unique:唯一性數據, 該條欄位的值需要保證唯一,不能重覆
auto_increment:自增,只能加給key的int類型欄位輔助修飾
not null:不為空 - 針對一些欄位,如註冊時的用戶名,出生人的性別等,這些需求下的欄位,只不能設置為Null,必須要對其賦值
default:預設值 - 對有預設值意外的欄位進行賦值時,有預設值的欄位會被賦預設值
unsigned:無符號 - 存儲的數字從0開始
zerofill:0填充 - 存整數時數據長度小於取值範圍長度,會在數字左方用0填充
"""
mysql>: create table td1 (x int, y int default 0, z int default 100);