Spring Hibernate保存波兰字符数据遇UTF-8问题:字符转为问号
嘿,我太懂这种翻遍StackOverflow却找不到适配方案的挫败感了——波兰字符(像ą、ę、ó、ł、ź、ć这些)存进数据库就变问号,本质是编码链路某个环节没统一成UTF-8/UTF8MB4,结合你的Spring+Hibernate场景,咱们一步步排查修复:
1. 先确认数据库/表/字段的编码
这是最基础的环节,很多人容易忽略:
- 用SQL命令检查数据库编码:
SHOW CREATE DATABASE your_database_name; - 检查表和字段的编码:
SHOW CREATE TABLE your_table_name;
确保数据库、表、目标字段的字符集是utf8mb4(推荐,支持所有Unicode字符)或utf8,排序规则可以用utf8mb4_polish_ci适配波兰语排序。如果是latin1之类的编码,肯定会导致波兰字符丢失,直接修改编码即可:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci; ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci;
2. 修正JDBC连接串的编码参数
这是高频出错点!必须在数据库连接URL里明确指定编码,以MySQL为例,在application.properties或application.yml中配置:
spring.datasource.url=jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=UTC
重点是useUnicode=true和characterEncoding=utf8mb4,这会强制JDBC驱动用UTF8MB4编码传输数据,避免默认编码不兼容。
3. 配置Hibernate的编码参数
在Hibernate配置中同步编码设置,比如在application.properties里:
hibernate.connection.characterEncoding=utf8mb4 hibernate.connection.useUnicode=true
如果是用JPA实体类,还可以在字段上显式指定列定义(可选,但更稳妥):
@Column(name = "username", columnDefinition = "VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci") private String username;
4. 确保Web请求的编码统一
如果前端传来的字符本身就乱码,存库自然也不对。在Spring中配置字符编码过滤器,比如在你的SecurityConfig里添加Bean:
@Bean public FilterRegistrationBean<CharacterEncodingFilter> characterEncodingFilter() { CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); // 强制覆盖请求和响应的编码 FilterRegistrationBean<CharacterEncodingFilter> registrationBean = new FilterRegistrationBean<>(filter); registrationBean.addUrlPatterns("/*"); // 对所有请求生效 return registrationBean; }
Spring Boot默认有这个过滤器,但有时候会因为配置顺序失效,手动配置更可靠。
5. 最后检查项目文件编码
确保你的IDE(比如IntelliJ)和项目文件的编码都是UTF-8:
- IDE设置:File → Settings → Editor → File Encodings,把所有选项都设为UTF-8
- 项目中的.properties/.yml等配置文件也用UTF-8编码保存
测试小技巧
先直接用SQL语句往数据库插入波兰字符,如果能正常显示,说明问题在应用层(JDBC/Hibernate/Web编码);如果插入后还是问号,优先解决数据库本身的编码问题。
内容的提问来源于stack exchange,提问作者DevMario

