我正在使用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查询中的外部/重音字符
基础教程推荐
- SpringBoot使用Minio进行文件存储的实现 2023-03-15
- mongodb java driver在聚合/投影操作中隐藏id字段 2023-10-30
- Spring Cloud Alibaba负载均衡实现方式 2023-06-06
- JSP动态实现web网页登陆和注册功能 2023-07-30
- java – MongoDB – Spring – 保存对象会导致StackOverflowError 2023-10-30
- Java实现单机版五子棋游戏的示例代码 2023-05-19
- 关于spring循环依赖问题及解决方案 2023-02-04
- java – mySQL到PHP到JSON:String无法转换为JSONObject 2023-10-30
- Java通过Freemarker模板实现生成Word文件 2023-05-24
- mybatis-plus 如何操作json字段 2023-06-24
