java - utf8_unicode_ci 字符串插入不正确?
问题描述
我有 java 应用程序,通过它我可以在 MySQL DB 上执行不同的操作。问题是插入 utf8 字符串时没有正确插入。DB 的字符集是utf8
,我已将排序规则设置为utf8_unicode_ci
. 服务器连接整理也是utf8_unicode_ci
。此外,当我从phpMyAdmin插入数据时,它被正确插入,但是当我使用 JOOQ 从 Java 应用程序中插入数据时 - 它不是。例子:
Result<ExecutorsRecord> executorsRecord =
context.insertInto(EXECUTORS, EXECUTORS.ID, EXECUTORS.NAME, EXECUTORS.SURNAME, EXECUTORS.REGION, EXECUTORS.PHONE, EXECUTORS.POINTS, EXECUTORS.E_TYPE)
.values(id, name, surname, region, phone, 0, type)
.returning(EXECUTORS.ID)
.fetch();
哪里name = "Бобр"
和surname = "Добр"
, 产生元组 ???? 作为一个名字和???? 作为姓。我已经检查了两个字符串,它们正确地传递给了方法。
解决方案
正如@spencer7593 建议的那样,问题可能出在 JDBC 连接器中。所以我添加了url
以下连接:?characterEncoding=utf8
所以最终的 url 是"jdbc:mysql://localhost:3306/mydb?characterEncoding=utf8"
,其中mydb
是数据库的名称。这解决了我的问题。我还想添加以下语句(再次由@spencer7593 提供):
当我们正确配置了东西,但一切都没有工作时,我们的 goto 怀疑是 JDBC 驱动程序。为了理清 JVM 和 MySQL 数据库之间的时区差异,为了防止 JDBC 驱动程序通过对各种操作进行不合逻辑的组合来“提供帮助”,我们必须在连接字符串中添加两个额外的模糊记录设置。
进一步阅读
推荐阅读
- java - 将自纪元以来的毫秒数转换为 1582 年之前的日历日期时出现问题
- javascript - javascript - 如何将字符串拆分为对象数组
- android - 通过在我自己的服务器上解析向 android 设备发送推送通知的问题
- oracle11g - 如何将 Oracle 11g 本地数据库迁移到 Oracle 18c 云?
- unity3d - 使用 oculus 控制器围绕触摸的位置旋转
- angular - Angular 6:从另一个数组中获取一个数组
- ajax - AJAX 函数总是返回 html 代码以响应成功
- ios - ScrollView 水平和垂直移动..Frame 问题
- angular - 资产目录中的 Angular 7 静态配置文件
- c++ - 是否可以声明一个 constexpr 指针而不是指向 constexpr 的指针?