https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html
在数据的存储上,MySQL提供了不同的字符集支持。而在数据的对比操作上,则提供了不同的字符序支持,字符序也就是校验规则。
字符集 (character set) 定义了字符以及字符的编码。
字符序/校对 (collation) 定义了字符的比较规则。
MySQL支持多种字符集 与 字符序。
1、一个字符集对应至少一种字符序(一般是1对多)。
2、两个不同的字符集不能有相同的字符序。
3、每个字符集都有默认的字符序。例如,utf8 默认的字符序为
utf8_general_ci
, utf8mb4 默认的字符序为
utf8mb4_general_ci
,都是大小写不敏感的。
4、字符序命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以
_ci
(大小写不敏感)、
_cs
(大小写敏感)或
_bin
(二进制)结束。
*_bin
: binary case sensitive collation,也就是说是区分大小写的
*_cs
: case sensitive collation,区分大小写
*_ci
: case insensitive collation,不区分大小写
https://dev.mysql.com/doc/refman/5.6/en/show-character-set.html
语法:
SHOW CHARACTER SET [LIKE 'pattern' | WHERE expr]
MariaDB > show character set like '%utf%';
+---------+------------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+------------------+--------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
+---------+------------------+--------------------+--------+
或者从 information_schema.CHARACTER_SETS
表中查
mysql> use information_schema;
mysql> select * from CHARACTER_SETS;
show collation 查看可用字符序
字符序的命名,以其对应的字符集作为前缀,如下所示。比如字符序 utf8_general_ci,标明它是字符集utf8的字符序。
13.7.5.5 SHOW COLLATION Statement
https://dev.mysql.com/doc/refman/5.6/en/show-collation.html
语法
SHOW COLLATION [LIKE 'pattern' | WHERE expr]
MariaDB > show COLLATION LIKE '%utf8mb4%';
+------------------------------+---------+-----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+------------------------------+---------+-----+---------+----------+---------+
| utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 |
| utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 |
| utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 |
| utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 |
| utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 |
或者从 information_schema.COLLATIONS
表中查。
mysql> USE information_schema;
mysql> SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8";
https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html
建表 sql
CREATE TABLE row_sile_test (
id bigint auto_increment primary key,
col1 varchar(10000) DEFAULT NULL,
col2 varchar(10000) DEFAULT NULL,
col3 varchar(10000) DEFAULT NULL
) ENGINE = INNODB DEFAULT CHARSET = utf8;
报错:
[42000][1118] Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
原因:
MySQL 要求除 text 和 blob 外单行长度不超过 65535。
未开启 strict mode 时,varchar 长度大于 65535 时(指的是字节数大于65535,即字段长度大于等于 21846),MySQL 会自动转换为 TEXT
解决:
varchar(10000) 改为 text
注意:MySQL 5.7 默认开启 strict mode,开启 strict mode 时,varchar(21846) 会直接报错:[42000][1074] Column length too big for column ‘col1’ (max = 21845); use BLOB or TEXT instead
CREATE TABLE row_sile_test
id bigint auto_increment primary key,
col1 text DEFAULT NULL,
col2 text DEFAULT NULL,
col3 text DEFAULT NULL
) ENGINE = INNODB
DEFAULT CHARSET = utf8;
https://dev.mysql.com/doc/refman/8.0/en/integer-types.html
https://www.jianshu.com/p/61293b416335
https://stackoverflow.com/questions/3712222/does-mysql-ignore-null-values-on-unique-constraints
https://segmentfault.com/q/1010000006758650/a-1020000006759600
值得收藏:一份非常完整的MySQL规范
https://mp.weixin.qq.com/s/QAzb6yCS9NqOY066ZBcuSg
https://mp.weixin.qq.com/s/PIKUol_7AR1CU4FehJAJLw
https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html
2、TIMESTAMP 值范围从 1970-01-01 00:00:01 UTC 到 2038-01-19 03:14:07 UTC。 如果要存储超过 2038 的时间值,则应使用 DATETIME 而不是 TIMESTAMP。
DATETIME 的值范围为 1000-01-01 00:00:00 至 9999-12-31 23:59:59
3、MySQL 将 TIMESTAMP 存储在 UTC(有时区)值中,也就是说 TIMESTAMP 是带时区的。 但是,MySQL 存储 DATETIME 值是没有时区的。
这意味着如果使用 TIMESTAMP 数据来存储日期和时间值,则在将数据库移动到位于不同时区的服务器时时间的值可能不一样,所以应该认真考虑这个问题。
4、从 mysql5.7 开始 datetime 字段也可以指定默认值,并且格式和 timestamp 一样
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
11.2.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME
https://dev.mysql.com/doc/refman/8.0/en/timestamp-initialization.html
http://www.yayu.org/look.php?id=144
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME
https://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
https://laravel-china.org/articles/6927/some-tests-on-the-mysql-enum-type
- Mysql字符集和字符序
- mysql大小写敏感
- utf8和utf8mb4
- 查看mysql支持的字符集和字符序
- variables character_set_ 当前字符集
- variables collation_ 当前字符序
- MySQL中的字符集转换过程
- 创建表时指定字符集
- char/varchar/text
- varchar长度(为什么varchar长度经常定义为255?)
- TinyText/Text/MediumText/LongText
- TEXT不支持默认值
- 除TEXT/BLOB外单行长度不能超过65535
- bit
- boolean/tinyint
- tinyint/int/bigint
- tinyint/int/bigint等数据长度
- int(5)括号内的长度是显示长度
- MySQL unique和null
- default null与default ‘’
- 为什么建议MySQL列属性尽量用 NOT NULL
- MySQL日期和时间
- DATETIME
- DATETIME 存储毫秒(精度)
- DATETIME 与 TIMESTAMP 的区别
- TIMESTAMP 的默认值和自动更新
- enum 枚举类型
- 创建带有enum类型字段的表
- 修改enum字段的枚举值
- DECIMAL(10,4) 总共10位小数4位
- MysqlDataTruncation 超过小数位数报错
- float/double/decimal选择
Storage (Bytes) |
有符号最小值 |
无符号最小值 |
有符号最大值 |
无符号最大值 |
TINYINT |
SMALLINT |
-32768 |
32767 |
65535 |
MEDIUMINT |
-8388608 |
8388607 |
16777215 |
-2147483648 |
2147483647 |
4294967295 |
BIGINT |
$-2^{63}$ |
$2^{63}-1$ |
$2^{64}-1$ |
---|