我正在使用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查询中的外部/重音字符
- SpringCloud Sleuth实现分布式请求链路跟踪流程详解 2023-07-01
- 关于Java的Character类详解 2023-07-15
- 详解Java ReentrantReadWriteLock读写锁的原理与实现 2023-06-16
- 关于Swagger注释API的使用说明 2023-01-03
- Java连接Redis全过程讲解 2023-01-18
- Spring框架之IOC介绍讲解 2023-04-23
- jsp request.getParameter() 和request.getAttribute()方法区别详解 2023-07-30
- java后端+前端使用WebSocket实现消息推送的详细流程 2023-06-24
- SpringBoot+Redis防止恶意刷新与暴力请求接口的实现 2022-12-07
- Java拦截器Interceptor实现原理及代码示例 2023-08-07