美文网首页
MySQL 8.0 和 JDBC 8.0 需要注意的问题

MySQL 8.0 和 JDBC 8.0 需要注意的问题

作者: 丿记忆灬永殇丨 | 来源:发表于2019-04-01 19:26 被阅读0次

一、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_ciutf8mb4 已成为 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_ciuft8mb4 表示用 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 utf8utf8mb3)(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

相关文章

网友评论

      本文标题:MySQL 8.0 和 JDBC 8.0 需要注意的问题

      本文链接:https://www.haomeiwen.com/subject/arsdvqtx.html