作者:Willam2004
引言:
做程序开发经常会与数据库打交道,Ubuntu下连接Oracle数据库的工具也不少,如:SQuirreL SQL Client,SQLDeveloper等。但这些工具连接我们公司的数据库查询中文字符串时都是乱码。上网查了下(http://fanqiang.chinaunix.net/db/oracle/2001-04-16/1166.shtml),主要是因为服务器的字符集编码与本地客户端的编码不一致。执行:
select * from V$NLS_PARAMETERS
发现:NLS_CHARACTERSET 为"US7ASCII",说明oracle安装的字符集为ISO-8859-1,而我们访问的应用客户端形式多为GBK编码格式。但在我们的web应用中,对于中文显示却是正常的。是因为我们通过一种jdbcproxy包进行了编码转换,如配置:
<bean id="unpooledDataSource" class="com.mchange.v2.c3p0.DriverManagerDataSource">
<property name="driverClass">
<value>com.alibaba.china.jdbc.SimpleDriver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:oracle:thin:@xx.xx.xx.xx:1521:xx</value>
</property>
<property name="properties">
<props>
<prop key="user">xxx</prop>
<prop key="password">xxx</prop>
<prop key="bigStringTryClob">true</prop>
<prop key="clientEncoding">GBK</prop>
<prop key="serverEncoding">ISO-8859-1</prop>
</props>
</property>
</bean>
从配置可以看到,SimpleDriver是实现Driver接口的实现类,但真正的驱动程序的注册还是依赖Oracle的驱动程序的实现。其中最关键的配置参数:clientEncoding,serverEncoding,前者是指定客户端的字符集编码,serverEncoding是指定服务器端字符集编码。clientEncoding需要与本地的字符集要一致,serverEncoding与oracle的字符集要一致。
解决方案:
在SQuirreL SQL Client 可以指定数据库驱动程序,将jdbcproxy和oracle dirver的jar包添加进去(jdbcproxy依赖oracle driver包),但添加后,查询中文字符仍然乱码。
不行是因为应用通过spring注入方式将clientEncoding和serverEncoding进行了注入,在SQuirrel SQL Client没有进行指定。接下来很简单了,做一个jdbc-proxy的patch包,增加如果默认没有指定clientEncoding和serverEncoding,那么设定clientEncoding=GBK,serverEncoding=ISO-8859-1。
重新加入jdbcproxy,中文字符正常显示!
原理:
jdbcproxy最关键的地方,是通过代理模式,对jdbc中的各个接口,如Connection,ResultSet,Statement等,增加了CharsetParam和CharsetConvert进行字符编码的转换,而字符编码转换的核心却是非常简单的:
编码:
String newString = new String(oldstring.getBytes(clientEncoding),serverEncoding)
解码:
String newString = new String(oldstring.getBytes(serverEncoding),clientEncoding)
附类图:(工厂模式和代理模式)
- 大小: 62.9 KB
- 大小: 21.9 KB
- 大小: 70.7 KB
- 大小: 19.4 KB
- 大小: 11.4 KB
分享到:
相关推荐
Windows系统通常使用GBK编码来处理中文,而Ubuntu系统默认使用UTF-8编码,这导致了两者在处理中文文件时出现乱码的问题。本文详细介绍了如何解决Ubuntu和Windows在处理文件时发生的乱码问题。 首先,我们需要了解...
要解决 Ubuntu 下使用 Tomcat 搭建网站出现中文乱码的问题,需要统一服务器的字符编码,包括 Linux 服务器、Tomcat 配置文件和 MySQL 数据库。通过统一字符编码,可以确保服务器的字符编码是一致的,避免乱码的出现...
Ubuntu 下 QT 显示中文乱码问题解决方案 在 Ubuntu 系统中,使用 QT 库开发应用程序时,可能会出现中文乱码的问题。这种情况下,需要解决中文乱码问题,以确保应用程序的正确显示。本文将详细介绍 Ubuntu 下 QT ...
本文提供了一个完整的解决方案,旨在帮助用户在保持Linux中文环境的情况下,顺利安装Oracle并解决汉字乱码问题。 首先,我们需要安装Java Development Kit (JDK),因为Oracle数据库的安装和配置过程需要用到JDK。在...
这是因为 Ubuntu 15.10 下的默认字体族未映射中文字体,导致 Keepass2 无法正确地显示中文字符。 解决方案1:修改 /etc/fonts/conf.avail/65-nonlatin.conf 要解决 Keepass2 中文乱码的问题,可以通过修改 /etc/...
例如,在Ubuntu系统中,默认的字体配置可能不支持中文字符,从而导致中文乱码问题。 2. 扫瞄器设置不正确:扫瞄器设置不正确也可能会导致中文乱码问题。例如,在Firefox扫瞄器中,如果不正确地设置了字体或语言设置...
在Ubuntu操作系统上安装Oracle SQL Developer并解决中文乱码问题是一个常见的需求,特别是在开发或管理具有中文数据的Oracle数据库时。以下是一步一步的详细指南: 首先,你需要从Oracle的官方网站下载SQL ...
解决ubuntu下文件中中文乱码问题,解决大家在ubuntu下不能查看中文文档的困扰,让大家很好地使用ubuntu系统完成日常所有所需工作
在Linux环境下安装Oracle数据库时,可能会遇到一个常见的问题:安装界面中文显示为“小方块”或乱码。这个问题通常是由于系统缺少必要的字体支持导致的。以下是一套详细的解决方案,帮助你解决这个问题。 1. **确认...
解决 Ubuntu 下中文乱码问题终极版 在 Ubuntu 系统中,中文乱码问题是一个常见的问题,影响着用户的使用体验。解决这个问题需要从多方面入手,包括 TXT 文件乱码、Rhythmbox 乱码和 WINE 乱码等。下面我们将逐一...
"Ubuntu下Eclipse中文乱码解决" 在Ubuntu系统中使用Eclipse时,可能会遇到中文...解决Ubuntu下Eclipse中文乱码的问题需要让Ubuntu支持GBK编码,然后在Eclipse中设置GBK编码。这将确保中文字符正确地显示,而不是乱码。
这是因为 Ubuntu 本身不带有的字体所致,类似于 牵扯版权问题。但是,Windows 中是有的。解决方法很简单,就是将字体文件从 Windows 复制到 LibreOffice 的配置目录下。 首先,需要找到 Windows 中的字体文件,路径...
在Ubuntu系统中,遇到命令行终端显示中文时出现乱码的情况是不少用户会遇到的问题,尤其是在进行中文环境下的编程或管理操作时,这无疑会给工作带来不便。本文将详细解析Ubuntu中命令行中文乱码的原因,并提供一套...
Ubuntu MySQL 中文乱码问题解决方案 在 Ubuntu 系统中,MySQL 数据库中文乱码问题是一个常见的问题。乱码问题可能是由于 MySQL 数据库的字符编码设置不正确所致。解决这个问题需要对 MySQL 数据库的字符编码进行...
这是因为 Ubuntu Server 环境下缺少必要的中文字体,导致浏览器和桌面环境无法正确渲染中文字符。 解决方案 要解决 Ubuntu Server 环境下中文乱码之显示方块的问题,我们可以安装以下几个中文字体包: 1. fonts-...
Ubuntu 11.04 下 Gedit 和 vim 中文乱码问题解决方案 在 Ubuntu 11.04 操作系统中,使用 Gedit 和 vim 编辑器时,经常会遇到中文乱码问题。这种问题的出现是由于编辑器不能正确地识别和处理中文字符编码所致。解决...
针对Ubuntu 11.10下的文本乱码问题,本文将详细介绍一种经过实践验证有效的解决方案,帮助用户顺利解决乱码困扰,恢复文本文件的正常读写功能。 **第一步:安装DConf Tools** 首先,我们需要通过终端命令安装DConf...
这种问题的出现可能是因为 Ubuntu 的默认设置不支持中文显示,或者是因为系统的 locale 设置不正确。 解决方案一:安装 zhcon 并配置 zhcon 是一个中文支持的命令行界面工具,可以解决 Ubuntu 字符界面中文乱码的...
在 Ubuntu 16.04 系统中安装 VLC 播放器时,可能会出现中文乱码的问题,这是由于 VLC 播放器的默认编码设置不正确所致。为了解决这个问题,我们可以通过修改 VLC 播放器的字幕语言默认编码和文本字幕解码器的设置来...
中文乱码通常是因为文件编码格式不一致导致的。不同的操作系统、软件默认使用的字符集可能不同。例如,Windows系统默认使用GBK编码,而Linux系统默认使用的是UTF-8编码。当文件在不同系统间传递时,如果接收方未能...