mysql杂谈
2023-06-15 本文已影响0人
温岭夹糕
目录
- 类型
1.类型
1.1mysql字符集问题(character set)和排序
charset指的是对unicode字符集的编码方式
show variables like 'character%';
show create database <databaseName>;
第二条命令看到的字符集是根据my.cnf的[default-character-set]设置的
//my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
default-character-set=utf8mb4
创建数据库指定字符集
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name
[create_option] ...
create_option: [DEFAULT] {
CHARACTER SET [=] charset_name
| COLLATE [=] collation_name
}
collate称为排序,又称校对规则,都是定义对字符串的校对:
- utf8_bin 是将字符串每一个字符用二进制存储
- utf8_genera_ci 不区分大小写
- utf8_genera_cs 大小写敏感
通常情况下utf8_genera_ci对中英文的校验准确度够用了
1.2 varchar类型的长度到底是多少
mysql ref对varchar的用法定义是
[NATIONAL] VARCHAR(M)
[CHARACTER SET charset_name]
[COLLATE collation_name]
M的范围是[0-65535],即最多占用65535个字节,其中varchar的存储规则:
- 4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节)
-
5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个。最大大小是65532字节,即最多21844个汉字
image.png
所以更像GO语言的rune类型,即码点。
其他补充:
- char代表定长,会自动填充
- binary和blob代表存储二进制数据
1.3MySQL时间字段究竟使用INT还是DateTime型?
mysql中表示日期的类型有YEAR、TIME、DATE、DTAETIME、TIMESTAMP,其中
- TIMESTAMP 占 4个字节,表示时间到2038年
- datetime 占8个字节, 表示时间到9999年
时间类型本质上也是使用int去存储的,所以如果从性能角度讲两者是没差别的,当存在大量查询和排序时加个索引就能解决。而且datetime语义化更好。建议更多使用datetime