文章目录

  • 前言
  • 再次出现的现象
  • 分析
  • 失败尝试1
  • 失败尝试2
  • 失败尝试3
  • 解决
  • 结论

前言

之前《Oracle数据库字符集为WE8ISO8859P1存储中文和客户端程序展示中文问题》记录了类似的问题。我们发现只要客户端和服务端字符集一致,比如NLS_LANG=american_america.WE8ISO8859P1,客户端程序也能够正常用Oracle读写中文(Toad乱码属于自身问题)。

再次出现的现象

但是用Java SE客户端程序(和C++或Delphi客户端程序在同一台计算机上)访问该Oracle英文字符集数据库。发现取到的中文字符还是乱码 —— 是的,可执行程序通过设置一致的字符集解决了问题,对Java程序不管用。

分析

通过查阅资料,发现JDBC不再使用客户端的NLS_LANG这个环境变量。
而是使用了客户端系统的语言进行数据库连接???

失败尝试1

jdbc thin vs jdbc oci
无论设置无需Oracle客户端的thin模式,还是需要客户端的oci模式,都无法解决这个问题。
网上很多文章比如这篇,写的是 把 thin 改为 oci 后,就用客户端了,就可以读取NLS_LANG环境变量了, 实际测试在Oracle11g下是不行的,依然乱码。

失败尝试2

MySQL的方式并不适合Oracle数据库,后面不能带参数。

conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf8",

失败尝试3

看到JavaEE项目的同事这么写的:
后端在spring的配置文件配置数据据源时添加如下property

    <property name="ConnectionProperties"><!-- 链接参数配置 “clientEncoding”和“serverEncoding”,分别指定数据库客户端和服务器端的字符编码 Encoding Filter从这两个参数获取编码 --><value>clientEncoding=GBK;serverEncoding=ISO-8859-1;</value></property>

配置数据库连接字符串如下:

jdbc:wrap-jdbc:filters=encoding:jdbc:oracle:thin:@IP地址:1521/orcl

但是JavaSE项目并没有spring或其它框架……
同时JDBC表示并不认识wrap-jdbc是什么。

解决

方案1:每句都自己转码(麻烦死了)。

new String(result.getString(col).getBytes("ISO8859-1"), "GBK") //读数据集
new String(aValue.getBytes("GBK"), "ISO8859-1") //写入数据库

方案2:使用阿里巴巴的Druid。

官方定义:Druid是Java的数据库连接池,能够提供强大的监控和扩展功能。
阿里巴巴的《Druid简介》。请注意阿里巴巴不是阿帕奇。。。

即使去掉违反广告法的文字描述后,依然能感觉到很厉害!毕竟人形德鲁伊能变熊/豹/猎豹/水下/飞行/鸟,并且喜欢荷兰队的年纪稍大一点的朋友也都知道,范尼是德鲁伊呀。

pom.xml

<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.22</version>
</dependency>

java

//驱动
//public static String driverClass = "oracle.jdbc.driver.OracleDriver";
public static String driverClass = "com.alibaba.druid.proxy.DruidDriver";
...
//连接字符串:
//String connurl = "jdbc:oracle:thin:@192.168.168.115:1521/testdb";
String connurl = "jdbc:wrap-jdbc:filters=encoding:jdbc:oracle:thin:@192.168.168.115:1521/testdb";
...
//设置属性(包括用户名密码):
//毕竟咱没有Spring框架可以设置编码格式。
Properties info = new Properties();
info.setProperty("user","test");
info.setProperty("password","******");
info.setProperty("serverEncoding","ISO-8859-1"); //服务端编码
info.setProperty("clientEncoding","GBK"); //客户端编码
conn = DriverManager.getConnection(connurl,info);
...

之后用正常的语句取数据,insert时也不用转码(绑定变量或直接拼字符串)。
是改老项目最方便的方法。

结论

客户端和服务器都为单字节字符集,操作系统支持中文显示。
应用程序是可以显示中文的。
但是Java SE程序只用标准JDBC是没有简单办法的。

如果您知道用标准JDBC的解决办法,请一定留言赐教啊!!!

Oracle数据库字符集为WE8ISO8859P1存储中文和Java读写展示相关推荐

  1. 理解ORACLE数据库字符集

    一.引言     ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化 ...

  2. ORACLE数据库字符集

    ORACLE数据库字符集 一.字符集基本知识 二.查询oracle server端的字符集 三.修改oracle的字符集 字符集基本知识 1.基本认知 ORACLE数据库字符集,即Oracle全球化支 ...

  3. linux 查看oracle数据库字符集,Oracle字符集的查看查询和Oracle字符集的设置修改

    三. 修改Oracle的字符集 8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误. Startup nomount; A ...

  4. Oracle数据库字符集问题解决方案大全

    在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多 ...

  5. oracle数据库字符集AL32UTF8修改为ZHS16GBK即从超集到子集

    转自:https://www.cnblogs.com/perilla/p/3873653.html 一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的 ...

  6. 关于Oracle数据库字符集的选择及乱码情况

    关于Oracle数据库字符集的选择及乱码情况 背景: 在项目上,开发人员在安装Oracle数据库时采用的默认的编码集,导致后期正式运行时出现某些生僻字和中文符号. 出现乱码.出现的情况就是某些生僻字或 ...

  7. oracle数据查字符集,Oracle数据库字符集的查询

    Oracle数据库字符集通俗的讲就是一个字节数据的相关的解释的符号集合,它具有 大小的差异,也有互相包容关系.Oracle是支持国家语言的相关体系结构,它允许你使用本地化语言来存储,处理,检索数据.它 ...

  8. oracle 字符集修改方案,Oracle数据库字符集问题解决方案大全

    在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比 较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉 字信息的显示方面着实给中国用户带来不少麻烦,笔 ...

  9. Oracle数据库系统结构一(存储结构)

    1.Oracle数据库系统结构概述 Oracle数据库由存放在磁盘上的数据库(DB)和对磁盘上的数据库进行管理的数据库管理系统(DBMS)两部分构成,分别对应着数据库的存储结构和软件结构.  Orac ...

最新文章

  1. CentOS 6.7快速搭建lamp环境
  2. hexo博客修改博文中日期的颜色
  3. 用计算器计算“异或CRC”
  4. 【2013.4.6】微软暑期实习生答案(zz)
  5. python网络爬虫_Python爬虫实战之网络小说
  6. 为什么自己编写的页面总是在那里抖动_SEO排名,为什么旧页面比新内容排名高?...
  7. Bootstrap3基础 warning/active... 表格的状态类(不同的背景色)
  8. python打印日历代码_带tkinter的日历(打印所选日期)
  9. Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣
  10. Java Swing Mysql实现的员工工资管理系统项目源码附带视频指导运行教程
  11. bfc是什么_清除浮动和 BFC
  12. 清平乐·风鬟雨鬓 [清] 纳兰性德
  13. word中装订线位置_Word操作技巧:Word文档双面打印全攻略,解决打印难题
  14. 寒假小软件开发记录02--布局
  15. 绿联蓝牙驱动 linux,Ugreen绿联蓝牙驱动下载
  16. 【单片机毕业设计】【mcuclub-jj-035】基于单片机的保险柜的设计
  17. 基于51单片机的单词记忆测试器
  18. 各种压缩格式介绍!(摘录2)
  19. 微信小程序,map地图中在底部添加半透明视图布局
  20. 数据结构 -- 魔王语言解释

热门文章

  1. 3.20 使用钢笔工具绘制冰爽可口的冰激凌 [Illustrator CC教程]
  2. 数值分析-基本算法流程图:二分法、简单迭代法、复化梯形公式、弦截法、辛普森
  3. java.io.UnsupportedEncodingException
  4. Convolutional Networks for Voting-based Anomaly Classification in Metal Surface Inspection-论文阅读笔记
  5. 几种常用加密算法比较
  6. Nacos配置更新不生效
  7. Flutter 所有控件widget(持续更新)
  8. 基于TCP的聊天系统
  9. 大型多人在线游戏开发
  10. Thrift安装介绍