字符类型
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"]');