Azure SQL配合Hibernate使用时存储特殊字符转为问号问题求助
解决方案
该问题核心是应用到Azure SQL的链路上Unicode字符没有被正确传递,你可以按以下步骤排查修复:
- 首先修正JDBC连接串配置,必须添加
sendStringParametersAsUnicode=true参数,示例配置如下:
该参数会强制JDBC驱动将字符串参数以Unicode格式传递到数据库,避免驱动默认将字符串转成非Unicode编码导致特殊字符丢失,这是本地SQL Server正常、Azure SQL异常最常见的原因:多数本地测试环境的JDBC配置默认开启了该参数,而UAT环境的连接串未显式配置。jdbc:sqlserver://<你的Azure SQL实例地址>.database.windows.net:1433;database=<库名>;sendStringParametersAsUnicode=true;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30; - 检查Hibernate方言配置,确保使用对应版本的SQL Server方言,建议选用
org.hibernate.dialect.SQLServer2016Dialect及以上版本,老版本方言对NVARCHAR类型的参数绑定逻辑存在缺陷,会导致Unicode字符传输异常。 - 显式指定实体类对应字段的映射类型,在
shipping_address对应的实体属性上补充columnDefinition配置,强制Hibernate按NVARCHAR类型处理参数:@Column(name = "shipping_address", columnDefinition = "NVARCHAR(MAX)") private String shippingAddress; - 确认Java应用启动参数配置了
-Dfile.encoding=UTF-8,避免UAT服务器默认系统编码非UTF-8导致应用层字符转码异常。 - 你可以先做基础验证排除数据库本身问题:直接在Azure SQL查询编辑器中执行带N前缀的插入语句,若执行后特殊字符存储正常即可确认数据库侧配置无问题,问题出在应用到数据库的链路层:
INSERT INTO test.[order] (shipping_address) VALUES (N'{"test":"Ω"}')
内容的提问来源于stack exchange,提问作者soubhagya senapati
相关产品推荐
相关产品推荐

