MySQL 配置使用 utf8 字符编码的 JDBC url

Posted

技术标签:

【中文标题】MySQL 配置使用 utf8 字符编码的 JDBC url【英文标题】:JDBC url for MySQL configuration to use utf8 character encoding 【发布时间】:2013-08-06 04:02:03 【问题描述】:

mysql 5.6 配置

我已手动配置/etc/mysql/my.cnf 以使用utf8。见下文:

[mysqld]
character-set-server=utf8
character-sets-dir=/usr/share/mysql/charsets

[mysql]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

[mysqladmin]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

[mysqlcheck]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

[mysqldump]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

[mysqlimport]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

[mysqlshow]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

[client]
character-sets-dir=/usr/share/mysql/charsets default-character-set=utf8

从控制台:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.01 sec)

应用配置

现在对于网络应用,我在 Tomcat 的 context.xml 中使用了这两个连接 url

url="jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"

url="jdbc:mysql://localhost:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=utf8&connectionCollation=utf8_general_ci"

以上不起作用,并为我提供了以下应用程序。

show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

这里可能有什么问题?为什么显示utf8mb4 而不是utf8

【问题讨论】:

【参考方案1】:

您可能需要处理以下问题:

Changes in MySQL Connector/J 5.1.13 (2010-06-24)

Connector/J 不支持服务器 5.5.2 和更高版本的 utf8mb4。

Connector/J 现在自动检测配置了character_set_server=utf8mb4 的服务器,或者在建立连接时在SET NAMES= 调用中将使用characterEncoding=... 传递的Java 编码utf-8 视为utf8mb4。 (错误 #54175)

【讨论】:

更新到最新的mysql驱动解决了我的问题。 @William 提示是正确的。 utf8mb4 是 MySQL 的 UTF-8。如果您在 MySQL 中使用 utf8,您将错过 Unicode 的重要部分(星体符号)。将所有内容、表格、数据库切换到utf8mb4,否则您可能会丢失数据。是的,我知道,很荒谬,对吧?他们一定是在为晚上外出编写代码的那一天弄糊涂了。 不过,它似乎应该将 character_set_connection 设置为 utf8mb4,就像 SET NAMES 所做的那样。 MySQL原来用3个字节编码utf8...这是错误的。 UTF8 最多使用maximum of 4 bytes。但是必须保持与旧错误的向后兼容,他们通过引入utf8mb4 来修复它,这与世界其他地方称为UTF8 的编码相同。所以,use utf8mb4 if you want full unicode support。不好的是很少有人知道这一点,所以新系统不断使用错误的编码创建。 你说的这个版本不适合我,我用mysql-connector-java-8.0.26.jar代替【参考方案2】:

对于您的网络应用,请尝试使用characterEncoding=utf8 而不是 UTF-8。这解决了我的 SonarQube 容器问题。

【讨论】:

以上是关于MySQL 配置使用 utf8 字符编码的 JDBC url的主要内容,如果未能解决你的问题,请参考以下文章

MySQL字符编码设置方法

MySQL高级

Mac下更改Mysql5.7的默认编码为utf8

Mysql设置字符编码及varchar宽度问题

微信emoji表情编码 MySQL 存储 emoji 表情符号字符集

mysql sql怎么设置编码