Java向SQL Server传递俄文字符乱码及截断问题求助
解决方案
1. 修正SQL Server数据库连接串参数
SQL Server JDBC驱动不适用MySQL的useUnicode=true;characterEncoding=utf8参数,需添加**sendStringParametersAsUnicode=true**,确保字符串以Unicode格式传递给SQL Server,匹配nvarchar字段类型。示例连接串:
jdbc:sqlserver://[服务器地址]:1433;databaseName=[数据库名];sendStringParametersAsUnicode=true;characterEncoding=UTF-8
同时确保使用最新版Microsoft JDBC Driver for SQL Server,旧版本可能存在Unicode处理bug。
2. 处理请求参数编码
在接收表单提交的Servlet的doPost方法开头,强制设置请求编码为UTF-8,避免POST请求的俄文参数被容器默认的ISO-8859-1解析导致乱码:
request.setCharacterEncoding("UTF-8");
若使用全局编码过滤器,确保过滤器同时设置请求和响应编码:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); chain.doFilter(request, response); }
3. 验证PreparedStatement参数传递
当前代码使用preparedStatement.setString(1, product.getName())是正确的,若sendStringParametersAsUnicode=true生效,驱动会将字符串以Unicode发送到SQL Server。若使用较旧驱动,可尝试替换为setNString方法:
preparedStatement.setNString(1, product.getName());
4. 排查中间层编码转换
检查是否有自定义工具类、框架拦截器等中间环节对字符串进行了HTML实体编码(将俄文转为н这类格式),若存在需移除该逻辑,确保原始字符串直接存入数据库。
5. 确认数据库端配置
- 数据库默认排序规则需支持Unicode(如
SQL_Latin1_General_CP1_CI_AS或Russian_CI_AS) - 字段类型必须为
nvarchar(30)(而非varchar),nvarchar专门用于存储Unicode字符,每个字符占2字节,30长度可存储30个俄文字符。
内容的提问来源于stack exchange,提问作者ᴥSaiLyᴥ
相关产品推荐
相关产品推荐

