1.字符集
- 1. 字符集在什么時候可以發揮作用?
- 1. 保存數據的時候需要使用字符集
- 2. 數據傳輸的時候也需要使用字符集
- 3. 在存續的時候使用字符集
- 1. 在MySQL的服務器上, 在數據庫中, 在表的使用上, 在字段的設置上.
- 2. 在服務器安裝的時候, 可以指定默認的字符集
- 2. 常見字符集
- ASCII: 基於羅馬字母表的一套字符集, 它采用1個字節的低7位表示字符, 高位始終為0。
- LATIN1: 相對於ASCII字符集做了擴展, 仍然使用一個字節表示字符, 但啟用了高位, 擴展了字
- 符集的表示范圍。
- GB2312: 簡體中文字符, 一個漢字最多占用2個字節
- GBK: 只是所有的中文字符, 一個漢字最多占用2個字節
- UTF8: 國際通用編碼, 一個漢字最多占用3個字節
- UTF8MB4: 國際通用編碼, 在utf8的基礎上加強了對新文字識別, 一個漢字最多占用4個字節
/* gbk字符集最大字符串長度: 65535/2 -1 */ create table test( text varchar(32766) ) charset=gbk; /* utf8字符集最大字符串長度: 65535/3 -1 */ create table test1( text varchar(21844) ) charset=utf8; /* utf8mb4字符集最大字符串長度: 65535/4 -1 */ create table test4( text varchar(16382) ) charset=utf8mb4;
- 3. 查看當前mysql系統支持的字符集
mysql> show variables like 'character_%'; /* 輸出: +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | character_set_client | utf8mb4 | 客戶端來源數據使用的字符集 | character_set_connection | utf8mb4 | 連接層字符集 | character_set_database | utf8mb4 | 當前選中的數據庫的默認字符集 | character_set_filesystem | binary | 文件系統字符集 | character_set_results | utf8mb4 | 查詢結果使用的字符集 | character_set_server | utf8mb4 | 默認的內部操作字符集 | character_set_system | utf8 | 系統元數據(字段名、表名等)的字符集 | character_sets_dir | /usr/lo... | +--------------------------+------------+ */
- 4. 修改當前的 mysql 系統的字符集編碼
- 全部修改
set names gbk;
- 指定修改
set character_set_client = gbk; set character_set_results = gbk;
- 它是臨時性命令, mysql鏈接斷開以后, 再次連接時會恢復原狀。
2.校對集
在某一種字符集下, 為了使字符之間可以互相比較, 讓字符和字符形成一種關系的集合, 稱之為校對集。
比如說 ASCII 中的 a 和 B, 如果區分大小寫 a > B, 如果不區分 a < B;不同字符集有不同的校對規則, 命名約定:以其相關的字符集名開始, 通常包括一個語言名, 並且以_ci 、_cs 或 _bin 結束。
- _ci : 大小寫不敏感
- _cs : 大小寫敏感
- _bin : binary collation 二元法, 直接比較字符的編碼, 可以認為是區分大小寫的, 因為字符集中'A'和'a'的編碼顯然不同。
/* 數據庫默認的排序方式,是升序 */ create table t1( str char(1) ) charset=utf8mb4 collate=utf8mb4_general_ci; -- _general_ci 后綴的都是不區分大小寫 的 create table t2( str char(1) ) charset=utf8mb4 collate=utf8mb4_bin; -- 看到后綴邊是_bin的都是區分大小的 /* Linux中Mysql是區分大小的 需要自己去配置 vim /etc/mysql/my.cnf 找到[mysqld] 1是不區分大小寫,0是區分大小寫 */ lower_case_table_names=1
show character set; -- 查看字符集 和 校對集 show collation; -- 顯示所有的校對集
3.MySQL的數據類型
3.1整型
- 一個無符號數一定是非負數
create table t3(
age tinyint unsigned
);
- 顯示寬度 (zerofill),整型顯示寬度, 位數不足時用 0 填充
create table t4( id int(10) zerofill primary key auto_increment, name char(32) ); insert into t4 values(12345, '5個'); insert into t4 values(1234567890, '10個'); insert into t4 values(123456789012, '12個'); select * from t4;
3.2浮點數
定點數的位數更加長 使用方式:
- float(M,D)
- double(M,D)
- decimal(M,D)
- M 是支持多少個長度, D 是小數點后面的位數
create table t5 ( a float(10, 2), b double(10, 2), c decimal(10, 2) );
3.3字符串類型
CHAR 與 VARCHAR 類型的區別
思考:
- 字符串、浮點型等都可以隨意指定大小, 那么是不是平時操作的時候隨意指定一個就可以呢?
- 答:不是, 數據類型並不是越大越好, 越大的類型會造成數據臃腫, 存儲空間占用過大, 數據檢索也會變慢
3.4枚舉(enum)
多選一的時候使用的一種數據類型
在前端使用單選框的時候, 枚舉類型可以發揮作用
枚舉類型的優點:
- 1. 限制了可選值
- 2. 節省空間
- 3. 運行效率高
create table t6( name varchar(32), sex enum('男','女','保密') default '保密' ); -- 枚舉類型的計數默認從1開始 insert into t6 set name='王寶強',sex=1;
3.5集合(set)(用的不多)
SET最多可以有64個不同的成員。類似於復選框, 有多少可以選多少。
create table t7 ( name varchar(32), hobby set('吃','睡','玩','喝','抽') ); insert into t7 values('張三','睡,抽,玩,吃,喝'); insert into t7 values('李四','睡,抽');
- 為什么不是用 set 類型?
- 在現代網站開發中, 多選框的值有上千個, 值存儲的空間沒有索引用的多
- 那復選框的問題怎么解決?
- 將復選框的值單獨設計成一張表
3.6時間類型
3.6.1datetime
create table datetime_test ( create_at datetime ); insert into datetime_test values('2019-4-2 16:54:00'); insert into datetime_test values('2019/4/2 16:54:00'); insert into datetime_test values(now()); -- 年份最大支持4個長度 insert into datetime_test values('10000/4/2 16:54:00'); -- 錯誤 insert into datetime_test values('9999/4/2 16:54:00');
3.6.2time
create table time_test ( create_at time ); insert into time_test values('12:12:12'); insert into time_test values('100:12:12'); insert into time_test values('-100:12:12'); insert into time_test values('10 10:12:12'); -- 時間的范圍是: [-838:59:59 - 838:59:59] insert into time_test values('839:12:12'); -- 錯誤的
3.6.3timestamp 時間戳類型
- 時間戳類型在顯示方面和datetime是一樣的, 在存儲上不一樣
- 范圍從 1970-1-1 0:0:0 到 2038-1-19 11:14:07
- 時間戳使用 4 個字節表示
- 該值大小與存儲的位長有關: 2 ** (4 * 8 - 1)
create table timestamp_test ( create_time timestamp ); insert into timestamp_test values(now()); insert into timestamp_test values('2038-1-19 11:14:07'); -- 時間戳最大值 insert into timestamp_test values('2038-1-19 11:14:08'); -- 錯誤
3.6.4year
create table `year`( create_at year ); -- 從1900年開始 - 1900+255 insert into `year` values(now()); insert into `year` values('2155'); -- 年份最大值 insert into `year` values('2156'); -- 錯誤
3.7布爾值
mysql中的bool類型也是1和0。
create table `bool`( cond boolean ); insert into `bool` set cond=True; -- 成功 insert into `bool` set cond=False; -- 成功 insert into `bool` set cond=1; -- 成功 insert into `bool` set cond=10; -- 成功 insert into `bool` set cond=-1; -- 成功 insert into `bool` set cond=0; -- 成功 insert into `bool` set cond=0.1; -- 成功 insert into `bool` set cond='True'; -- 失敗
3.8列的屬性
- 插入的值是否可以為空
- null : 是可以為空,默認不寫
- not null : 不可以為空,如果插入的時候,摸個字段的值為空,則報錯
create table null_test ( id int primary key auto_increment, username varchar(32) not null, pwd varchar(16) null ); insert into null_test values(null,null,null);
- default
- 默認值一般是和null做搭配的
create table default_test ( id int primary key auto_increment, username varchar(32) default 'admin' not null, pwd varchar(16) default 123456 ); insert into default_test (username) values ('admin');
- auto_increment
- 自動增長的列
- 默認從 1 開始
- 常配合主鍵使用的
create table auto_inc ( id int primary key auto_increment, name varchar(32) ); insert into auto_inc (name) values ('aaa'), ('bbb'), ('ccc'); select * from auto_inc;
- primary key
- 主鍵一般是唯一的標識
- 特性:不能為空,也不能重復,一張表當中只可以擁有一個主鍵
-- 這里只有一個主鍵,這種主鍵叫做聯合主鍵, 在項目中使用較少 create table double_pri_test ( id int, sid int, primary key(id,sid) ); insert into double_pri_test values (1, 1); insert into double_pri_test values (1, 2); -- 成功 insert into double_pri_test values (2, 1); -- 成功 insert into double_pri_test values (1, 1); -- 失敗
- unique
- 唯一鍵,保證列當中的每一個數據都不重復
- 郵箱不可以重復,手機號不可以重復
create table test_uniq ( id int auto_increment primary key, mobile char(11) unique ); insert into test_uniq set mobile=13999999999;
- comment
- 字段說明: 給開發者看的, 一般用來對相應字段進行說明
create table test_cmt ( ctime datetime comment '這個字段代表創建日期' );
3.9SQL注釋
- 單行注釋: -- 你好
- 多行注釋: /* 巴拉巴拉 */
- MySQL 獨有的單行注釋: # 哈哈哈哈
4.MySQL的運算符
4.1算數運算符
mysql> select 123 + 543, 321 * 5, -456 / 2, 10 % 3, 2 / 0, 3 % 0; +-----------+---------+-----------+--------+-------+-------+ | 123 + 543 | 321 * 5 | -456 / 2 | 10 % 3 | 2 / 0 | 3 % 0 | +-----------+---------+-----------+--------+-------+-------+ | 666 | 1605 | -228.0000 | 1 | NULL | NULL | +-----------+---------+-----------+--------+-------+-------+ 1 row in set, 2 warnings (0.00 sec)
4.2比較運算符
4.2.1常規比較
mysql> select 1=2, 2<3, 3<=4, 4>5, 5>=3, 8!=9, 8<>9, 'abc' = 'Abc', 'z' > 'a'; +-----+-----+------+-----+------+------+------+---------------+-----------+ | 1=2 | 2<3 | 3<=4 | 4>5 | 5>=3 | 8!=9 | 8<>9 | 'abc' = 'Abc' | 'z' > 'a' | +-----+-----+------+-----+------+------+------+---------------+-----------+ | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | +-----+-----+------+-----+------+------+------+---------------+-----------+ 1 row in set (0.00 sec)
4.2.2范圍比較
mysql> select 123 between 100 and 200, 'b' in ('a', 'b', 'c'); +-------------------------+------------------------+ | 123 between 100 and 200 | 'b' in ('a', 'b', 'c') | +-------------------------+------------------------+ | 1 | 1 | +-------------------------+------------------------+ 1 row in set (0.00 sec)
4.2.3Null比較
mysql> select 12 is null, 23 = null, null = null, null <=> null, null is null, 32 is not null; +------------+-----------+-------------+---------------+--------------+----------------+ | 12 is null | 23 = null | null = null | null <=> null | null is null | 32 is not null | +------------+-----------+-------------+---------------+--------------+----------------+ | 0 | NULL | NULL | 1 | 1 | 1 | +------------+-----------+-------------+---------------+--------------+----------------+ 1 row in set (0.00 sec)
4.2.4模糊比較: like
mysql> select 'HelloWorld' like 'hello%'; +----------------------------+ | 'HelloWorld' like 'hello%' | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) mysql>
4.2.5邏輯運算符
mysql> select 1 < 2 and 4 > 3; +-----------------+ | 1 < 2 and 4 > 3 | +-----------------+ | 1 | +-----------------+ 1 row in set (0.00 sec) mysql>