字符類型
1.字符集
現在推薦utf8mb4,可以存儲特殊符號和表情,utf8存儲不了特殊符號
- 不顯示特殊符號😎
select cast( 0xF09F988E as char charset utf8 ) as emoji;
- 顯示特殊符號😎
select cast( 0xF09F988E as char charset utf8mb4 ) as emoji;
使用ut8mb4,mysql8以下的版本,需要在配置文件裏,配置字符集
#服務端使用的字符集默認爲utf8mb4
character-set-server=utf8mb4
#設置mysql客戶端默認字符集
default-character-set=utf8mb4
修改表的字符集,不能使用ALTER TABLE emoji_test CHARSET utf8mb4;
只能使用: ALTER TABLE emoji_test CONVERT TO CHARSET utf8mb4
2.字符串排序
排序規則以 _ci 結尾,表示不區分大小寫(Case Insentive),_cs 表示大小寫敏感,_bin 表示通過存儲字符的二進制進行比較。需要注意的是,比較 MySQL 字符串,默認採用不區分大小的排序規則
3.存儲密碼
推薦使用 $salt$cryption_algorithm$value;
salt是鹽,cryption_algorithm代表算法類型,value是加密後的密碼
2.日期類型
1.TIMESTAMP與datetime比較
datetime可以存儲毫秒,如datetime(6),存儲6位毫秒數,最多佔用8個字節, timestamp類型可以存儲毫秒,最多佔用7個字節,TIMESTAMP字段存儲的最大值是‘2038-01-19 03:14:07
儘量使用datetime,因爲1.datetime不用時區轉換,性能更好2.TIMESTAMP字段存儲的最大值是‘2038-01-19 03:14:07',存儲數據量有限
2.在行數據變更時自動記錄變更時間
設置字段last_modify的屬性,即可實現
ALTER TABLE fight.std_task MODIFY COLUMN last_modify datetime(6) NOT null default CURRENT_TIMESTAMP(6) ON update CURRENT_TIMESTAMP(6);
-- 建表時字段定義
`last_modify` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
json類型
可以存儲對象和數組;最大數據量是1g
- 建表時建立虛擬列,實現虛擬索引
CREATE TABLE UserLogin (
userId BIGINT,
loginInfo JSON,
cellphone VARCHAR(255) AS (loginInfo->>"$.cellphone"),
PRIMARY KEY(userId),
UNIQUE KEY uk_idx_cellphone(cellphone)
);
JSON_UNQUOTE(JSON_EXTRACT(loginInfo,"$.wxchat")) wxchat 等價於loginInfo->>"$.cellphone" cellphone
- 修改已有表,新增虛擬列
ALTER TABLE std_task ADD COLUMN cellphone VARCHAR(255) AS (info->>"$.cellphone");
ALTER TABLE std_task ADD UNIQUE INDEX idx_cellphone(cellphone);
- 給json數組上創建索引
ALTER TABLE std_task ADD INDEX task_tag ((cast((tag_name->"$") as unsigned array)));
通過member of、json_contains、json_overlaps
- member of
`select * from std_task where 2 member of (tag_name -> "$") ;``
- json_contains
select * from std_task where json_contains ( (tag_name -> "$") ,'["4","6"]');
select * from std_task where json_contains ( (tag_name -> "$") ,'["4","10"]');