我正在使用Java和Spring的JdbcTemplate类在Java中构建一个查询Postgres数据库的SQL查询.但是,我在执行包含外部/重音字符的查询时遇到问题.例如(修剪)代码:JdbcTemplate select = new JdbcTemplate( postgresDataba...
我正在使用Java和Spring的JdbcTemplate类在Java中构建一个查询Postgres数据库的SQL查询.但是,我在执行包含外部/重音字符的查询时遇到问题.
例如(修剪)代码:
JdbcTemplate select = new JdbcTemplate( postgresDatabase );
String query = "SELECT id FROM province WHERE name = 'Ontario';";
Integer id = select.queryForObject( query, Integer.class );
将检索省id,但如果我改名为”Québec’,则查询无法返回任何结果(此值在数据库中,因此问题不在于它丢失).
我认为问题的根源是我需要使用的数据库将默认客户端编码设置为SQL_ASCII,根据this,它会阻止自动字符集转换. (当我告诉数据库使用’LATIN1’/’ISO-8859-1’时,Java环境编码设置为’UTF-8′)
当resultSets包含具有外来字符的值作为先前具有类似性质的问题的解决方案时,我能够手动指示编码.
例如:
String provinceName = new String ( resultSet.getBytes( "name" ), "ISO-8859-1" );
但是现在外来字符是查询本身的一部分,这种方法还没有成功. (我想,因为查询必须在执行之前保存在String中,然后将其分解为字节,然后更改编码只会使字符进一步混乱.)
有没有办法解决这个问题,而无需更改数据库的属性或重建它?
PostScript:我在编写标题时在StackOverflow上找到了this function,它似乎没有用(我可能没有正确使用它,但即使它确实有效,它似乎不是它可能是最好的解决方案.):
编辑:我为此选择了自己的答案,因为它将是我现在使用的;但是,如下面的评论所述,我很乐意看到其他可能更好的建议,只要我有权访问数据库.
解决方法:
如果从Java连接编码UTF-8并且数据库是ISO-8859-1,那么您应该在最初连接到DB之后运行此SQL命令:
SET client_encoding = 'UTF8';
然后PostgreSQL将所有输入解释为UTF-8,然后在服务器端将其转换为ISO-8859-1.除此之外你不应该做任何其他事情.
本文标题为:java – sql查询中的外部/重音字符
基础教程推荐
- Spring Boot静态资源路径的配置与修改详解 2023-05-19
- SpringBoot工程打包与运行的实现详解 2023-03-07
- 使用JSP技术实现一个简单的在线测试系统的实例详解 2023-07-30
- Javaweb动态开发最重要的Servlet详解 2023-03-31
- 基于Redis分布式锁Redisson及SpringBoot集成Redisson 2023-05-25
- Java 在 Array 和 Set 之间进行转换的示例 2023-07-14
- Java mysql详细讲解双数据源配置使用 2023-02-10
- springboot处理异常的5种方式 2023-03-31
- Java多线程解决龟兔赛跑问题详解 2023-04-23
- 实例解析JSP中EL表达式的各种运用 2023-08-03