一、MySQL 8.0 的字符集
当使用 CREATE DATABASE `test`;
创建 test
数据后使用 SHOW CREATE DATABASE `test`;
命令查看字符集配置:
mysql> SHOW CREATE DATABASE `test`;
+----------+------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------------------------------------+
| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ |
+----------+------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci
表明默认字符集为 utf8mb4
,默认排序规则为 utf8mb4_ai_ci
。utf8mb4
已成为 MySQL 8.0 的默认字符集,在 MySQL 8.0.1 及更高版本中将 utf8mb4_0900_ai_ci
作为默认排序规则。
UTF-8
编码是一种变长的编码机制,可以用 1~4 个字节存储字符。因为历史遗留问题,MySQL 中的 utf8
编码并不是真正的 UTF-8,最长只有 3 个字节(utf8mb3
)。当遇到占 4 个字节的 UTF-8 编码,例如 emoji 字符或者复杂的汉字,会导致存储异常。从 5.5.3 开始,MySQL 开始用 utf8mb4
编码来实现完整的 UTF-8,其中 mb4
表示 most bytes 4
,最多占用 4 个字节。从 8.0 之后 utf8mb4
作为默认字符编码。
字符除了需要存储,还需要排序或比较大小。MySQL 8.0 默认的排序规则是 utf8mb4_0900_ai_ci
。uft8mb4
表示用 UTF-8 编码方案,每个字符最多占 4 个字节。0900
指的是 Unicode 校对算法版本。ai
(accent insensitive)指的是口音不敏感,比如排序时e、è、é、ê和ë之间没有区别。ci
(case insensitive)表示不区分大小写,比如排序时a和A之间没有区别。如果需要重音灵敏度和区分大小写,则可以使用 utf8mb4_0900_as_cs
(accent sensetive、case sensitive)代替。
可以通过 show variables like "%character%";
查看 MySQL 默认字符集:
mysql> show variables like "%character%";
+--------------------------+----------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | C:\Software\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+----------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)
通过 SET character_set_xxx = 'utf8mb4';
来设置,可设置为如下:
+--------------------------+----------------------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | C:\Software\MySQL\MySQL Server 8.0\share\charsets\ |
+--------------------------+----------------------------------------------------+
8 rows in set, 1 warning (0.00 sec)
属性 |
含义 |
character_set_client |
客户端请求数据的字符集 |
character_set_connection |
从客户端接收到数据,然后传输的字符集 |
character_set_database |
默认数据库的字符集 |
character_set_filesystem |
把操作系统上的文件名转化成此字符集,默认binary是不做任何转换的 |
character_set_results |
结果集的字符集 |
character_set_server |
数据库服务器的默认字符集 |
character_set_system |
存储系统元数据的字符集,总是 utf8 ,不需要设置 |
二、Spring Boot 项目中的 JDBC 配置
Spring + JDBC 的配置:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: 12345
Spring Boot + Druid 的配置:
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8&serverTimezone=GMT%2B8
username: root
password: 12345
对于不同的 JDBC 版本也有区别:
区别 |
Connector/J 5 |
Connector/J 8 |
驱动 |
com.mysql.jdbc.Driver (Connector/J <=5) |
com.mysql.cj.jdbc.Driver (Connector/J 8) |
useUnicode |
useUnicode=true |
废弃 |
characterEncoding=UTF-8 |
utf8 (utf8mb3 )(Connector/J <=8.0.12) |
utf8mb4 (Connector/J >=8.0.13) |
useSSL |
useSSL=true/false |
废弃 |
sslMode |
无 |
sslMode=PREFERRED |
serverTimezone |
无 |
需指定,serverTimezone=GMT%2B8
|
若出现java.lang.RuntimeException: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
,则表明需要显式指出 serverTimezone=GMT%2B8
(GMT+8)或serverTimezone=Asia/Shanghai
。
设置全局或者会话时区:
set global time_zone = '+8:00'; # 修改 MySQL 全局时区为北京时间
set time_zone = '+8:00'; # 修改当前会话时区为北京时间
flush privileges; # 立即生效
SSL(Secure Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。SSL在传输层对网络连接进行加密,被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
属性 |
描述 |
默认值 |
characterEncoding |
字符编码。处理字符串时驱动程序应使用什么字符编码 |
autodetect |
serverTimezone |
服务器时区。覆盖时区的检测/映射。当服务器的时区未映射到 Java 时区时使用 |
|
useSSL |
使用 SSL 。与服务器通信时是否使用 SSL。对于 8.0.13 及更高版本,已过时,被sslMode 属性替代 |
true |
sslMode |
SSL 方式。DISABLED :建立未加密的连接;PREFERRED :如果服务器启用了加密连接,则建立加密连接,否则回退到未加密的连接;REQUIRED :如果服务器启用了它们,则建立安全连接,否则失败;VERIFY_CA :与REQUIRED 类似,但另外根据配置的证书颁发机构(CA)证书验证服务器 TLS 证书;VERIFY_IDENTITY :与VERIFY_CA 类似,但另外验证服务器证书是否与尝试连接的主机匹配 |
PREFERRED |
网友评论