You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL存储印地语内容显示问号问题求助(SpringBoot+JPA)

解决SpringBoot+JPA存储印地语到MySQL5.6显示问号的问题

我来帮你一步步排查这个印地语字符显示为????的问题,结合你描述的场景(本地MySQL8正常,生产MySQL5.6异常),核心问题大概率出在数据库连接编码、MySQL全局配置或者JDBC参数设置上,咱们逐个击破:

1. 硬性检查:确认MySQL5.6的utf8mb4支持版本

MySQL从5.6.10开始才完善了utf8mb4的支持,先确认生产环境的具体版本:

mysql -V

如果版本低于5.6.10,要么升级到5.6.10+(推荐),要么退而求其次用utf8字符集(但要确认你的印地语内容没有4字节Unicode字符,否则还是会乱码)。

2. 修正MySQL服务器全局字符集配置

Ubuntu下修改MySQL的配置文件(一般是/etc/mysql/mysql.conf.d/mysqld.cnf,找不到的话可以试试/etc/my.cnf),在[mysqld]区块添加以下配置:

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

然后重启MySQL服务:

sudo service mysql restart

⚠️ 注意:init_connect对root用户无效,如果你的应用是用root账号连接数据库,需要手动在代码里设置会话字符集,或者创建一个普通应用用户(更安全)。

3. 强制JDBC连接使用utf8mb4编码

这是最容易忽略的点!即使数据库和表的字符集是utf8mb4,如果JDBC连接没指定编码,还是会用默认的latin1或者旧版utf8(3字节)传输数据。

在SpringBoot的application.properties(或application.yml)里修改数据库连接URL,加上必要的参数:

spring.datasource.url=jdbc:mysql://your-host:3306/your-db?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=UTC

同时补充JPA/Hibernate的编码配置,确保Hibernate层面也用正确的编码:

spring.jpa.properties.hibernate.connection.CharSet=utf8mb4
spring.jpa.properties.hibernate.connection.characterEncoding=utf8mb4
spring.jpa.properties.hibernate.connection.useUnicode=true

4. 再次确认表和列的字符集配置

虽然你说已经修改了,但再用SQL验证一下,避免修改不生效:

-- 查看表的字符集
SHOW CREATE TABLE your_content_table;

-- 查看特定列的字符集
SELECT column_name, character_set_name, collation_name 
FROM information_schema.columns 
WHERE table_name = 'your_content_table' AND column_name = 'hindi_content_column';

确保列的character_set_name是utf8mb4,collation_name是utf8mb4_unicode_ci或utf8mb4_general_ci。如果不对,重新修改列:

ALTER TABLE your_content_table MODIFY hindi_content_column TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5. 检查客户端(Datagrip)的连接字符集

你说Datagrip能正常显示本地数据,但生产环境不行,那要确认Datagrip连接生产数据库时的字符集设置:

  • 打开Datagrip的数据库连接配置
  • 找到「Advanced」标签页
  • 确保characterEncoding设置为utf8mb4,或者在「URL」里手动加上&characterEncoding=utf8mb4

6. 验证数据插入前的编码正确性

既然你能在本地和Ubuntu终端正常打印印地语内容,说明抓取到的字符串是正确的UTF-8编码。可以在代码里插入前加一段调试代码,确认字节流:

String hindiContent = "你的印地语内容";
byte[] utf8Bytes = hindiContent.getBytes(StandardCharsets.UTF_8);
System.out.println("UTF-8字节长度:" + utf8Bytes.length);
// 插入数据库的逻辑

如果字节长度符合预期(印地语字符一般是3字节/字符),说明数据本身没问题,问题还是出在传输或存储环节。

按照以上步骤逐一排查,应该能解决印地语显示问号的问题。如果还是不行,可以尝试在插入数据前手动执行SET NAMES utf8mb4;语句,强制会话字符集。

内容的提问来源于stack exchange,提问作者Abhishek Prabhat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:53