Oracle数据库字符集为WE8ISO8859P1存储中文和Java读写展示
文章目录
- 前言
- 再次出现的现象
- 分析
- 失败尝试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读写展示相关推荐
- 理解ORACLE数据库字符集
一.引言 ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化 ...
- ORACLE数据库字符集
ORACLE数据库字符集 一.字符集基本知识 二.查询oracle server端的字符集 三.修改oracle的字符集 字符集基本知识 1.基本认知 ORACLE数据库字符集,即Oracle全球化支 ...
- linux 查看oracle数据库字符集,Oracle字符集的查看查询和Oracle字符集的设置修改
三. 修改Oracle的字符集 8i以上版本可以通过alter database来修改字符集,但也只限于子集到超集,不建议修改props$表,将可能导致严重错误. Startup nomount; A ...
- Oracle数据库字符集问题解决方案大全
在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多 ...
- oracle数据库字符集AL32UTF8修改为ZHS16GBK即从超集到子集
转自:https://www.cnblogs.com/perilla/p/3873653.html 一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的 ...
- 关于Oracle数据库字符集的选择及乱码情况
关于Oracle数据库字符集的选择及乱码情况 背景: 在项目上,开发人员在安装Oracle数据库时采用的默认的编码集,导致后期正式运行时出现某些生僻字和中文符号. 出现乱码.出现的情况就是某些生僻字或 ...
- oracle数据查字符集,Oracle数据库字符集的查询
Oracle数据库字符集通俗的讲就是一个字节数据的相关的解释的符号集合,它具有 大小的差异,也有互相包容关系.Oracle是支持国家语言的相关体系结构,它允许你使用本地化语言来存储,处理,检索数据.它 ...
- oracle 字符集修改方案,Oracle数据库字符集问题解决方案大全
在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比 较多.ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉 字信息的显示方面着实给中国用户带来不少麻烦,笔 ...
- Oracle数据库系统结构一(存储结构)
1.Oracle数据库系统结构概述 Oracle数据库由存放在磁盘上的数据库(DB)和对磁盘上的数据库进行管理的数据库管理系统(DBMS)两部分构成,分别对应着数据库的存储结构和软件结构. Orac ...
最新文章
- CentOS 6.7快速搭建lamp环境
- hexo博客修改博文中日期的颜色
- 用计算器计算“异或CRC”
- 【2013.4.6】微软暑期实习生答案(zz)
- python网络爬虫_Python爬虫实战之网络小说
- 为什么自己编写的页面总是在那里抖动_SEO排名,为什么旧页面比新内容排名高?...
- Bootstrap3基础 warning/active... 表格的状态类(不同的背景色)
- python打印日历代码_带tkinter的日历(打印所选日期)
- Silverlight C# 游戏开发:Flyer06小小的改进让游戏更有趣
- Java Swing Mysql实现的员工工资管理系统项目源码附带视频指导运行教程
- bfc是什么_清除浮动和 BFC
- 清平乐·风鬟雨鬓 [清] 纳兰性德
- word中装订线位置_Word操作技巧:Word文档双面打印全攻略,解决打印难题
- 寒假小软件开发记录02--布局
- 绿联蓝牙驱动 linux,Ugreen绿联蓝牙驱动下载
- 【单片机毕业设计】【mcuclub-jj-035】基于单片机的保险柜的设计
- 基于51单片机的单词记忆测试器
- 各种压缩格式介绍!(摘录2)
- 微信小程序,map地图中在底部添加半透明视图布局
- 数据结构 -- 魔王语言解释
热门文章
- 3.20 使用钢笔工具绘制冰爽可口的冰激凌 [Illustrator CC教程]
- 数值分析-基本算法流程图:二分法、简单迭代法、复化梯形公式、弦截法、辛普森
- java.io.UnsupportedEncodingException
- Convolutional Networks for Voting-based Anomaly Classification in Metal Surface Inspection-论文阅读笔记
- 几种常用加密算法比较
- Nacos配置更新不生效
- Flutter 所有控件widget(持续更新)
- 基于TCP的聊天系统
- 大型多人在线游戏开发
- Thrift安装介绍