1. 字符集
包括 MySQL 8.0 版本在内,字符集默认设置成 UTF8MB4,8.0 版本之前默认的字符集为 Latin1.
配置文件设置:
[mysqld]
character-set-server = utf8mb4
...
正确修改列字符集的命令
```sql
ALTER TABLE emoji_test CONVERT TO CHARSET utf8mb4;
CHAR 本质也是变长的。
鉴于目前默认字符集推荐设置为 UTF8MB4,所以在表结构设计时,可以把 CHAR 全部用 VARCHAR 替换,底层存储的本质实现一模一样
2. 排序
SHOW COLLATION LIKE 'utf8mb4%';
排序规则以 _ci 结尾,表示不区分大小写(Case Insentive),_cs 表示大小写敏感,_bin 表示通过存储字符的二进制进行比较。需要注意的是,比较 MySQL 字符串,默认采用不区分大小的排序规则
绝大部分业务的表结构设计无须设置排序规则为大小写敏感
3. 字段取值约束
- 在 MySQL 8.0 版本之前,可以使用 ENUM 字符串枚举类型,只允许有限的定义值插入。如果将参数 SQL_MODE 设置为严格模式(SET sql_mode = ‘STRICT_TRANS_TABLES’),插入非定义数据就会报错
由于类型 ENUM 并非 SQL 标准的数据类型,而是 MySQL 所独有的一种字符串类型。抛出的错误提示也不直观 - MySQL 8.0.16 版本开始,数据库原生提供 CHECK 约束功能,可以方便地进行有限状态列类型的设计
新增业务使用.老业务不建议修改
CREATE TABLE `User` (
`id` bigint NOT NULL AUTO_INCREMENT,
`sex` char(1) COLLATE utf8mb4_general_ci DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `user_chk_1` CHECK (((`sex` = _utf8mb4'M') or (`sex` = _utf8mb4'F')))
) ENGINE=InnoDB
ALTER TABLE … 修改check约束
4. 密码存储
一个真正好的密码存储设计,应该是:动态盐 + 非固定加密算法
即便别有用心的用户拿到当前密码加密算法,则通过加密算法 $cryption_algorithm 版本,可以对用户存储的密码进行升级,进一步做好对于恶意数据攻击的防范
密码存储如:
$salt$cryption_algorithm$value
-
$salt:表示动态盐,每次用户注册时业务产生不同的盐值,并存储在数据库中。若做得再精细一点,可以动态盐值 + 用户注册日期合并为一个更为动态的盐值。
-
$cryption_algorithm:表示加密的算法,如 v1 表示 MD5 加密算法,v2 表示 AES256 加密算法,v3 表示 AES512 加密算法等。
-
$value:表示加密后的字符串
本文探讨了MySQL数据库的字符集选择,推荐使用UTF8MB4,并介绍了排序规则,通常采用不区分大小写的_ci。字段取值约束方面,推荐避免使用ENUM,而利用新的CHECK约束。最后讨论了密码存储的最佳实践,应采用动态盐和非固定加密算法,以增强安全性。

被折叠的 条评论
为什么被折叠?



