hibernate查询客户端服务端字符集不一致的oracle数据

2019-08-27  本文已影响0人  乌龙窜白玉

问题描述:

oracle数据库字符集是个让人头疼的问题,特别是一些客户使用的是英文字符集数据库,但客户端显示的字符集却是中文的,由于历史的原因,导致字符集不能改。所以只能由查询、插入中文问题的服务程序更改了(我觉得这个处理很不优雅,但目前只想到这招)。

解决:

1. 查询数据库的字符集
select * from nls_database_parameters;//查看数据库字符集
数据库字符集.jpeg
NLS_LANGUAGE:SIMPLIFIED CHINESE
NLS_CHARACTERSET:WE8ISO8859P1

可以看出字符集不一致。导致web服务入参查询、插入时会出现乱码。

2. 更改入参字符,使之和服务端字符一致并插入数据分析。

如果不确定时,可以写个简单的插入接口,以不同字符格式插入数据,类似下面:

switch (type){
            case 0:
                System.out.println("default 0:");
                vName = new String(name.getBytes());
                break;
            case 1:
                System.out.println("1-utf8:");
                try {
                    vName = new String(name.getBytes("utf-8"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            case 2:
                System.out.println("2-gbk:");
                try {
                    vName = new String(name.getBytes("gbk"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            case 3:
                System.out.println("3-iso-8859-1:");
                try {
                    vName = new String(name.getBytes("iso-8859-1"));
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            case 4:
                System.out.println("4-gbk-to-iso8859:");
                try {
                    vName = new String(name.getBytes("gbk"),"iso-8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            case 5:
                System.out.println("5-utf8-to-iso8859:");
                try {
                    vName = new String(name.getBytes("utf-8"), "iso-8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            case 6:
                System.out.println("6-default-to-iso8859:");
                try {
                    vName = new String(name.getBytes(), "iso-8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
            case 7:
                System.out.println("7-iso8859-to-gbk:");
                try {
                    vName = new String(name.getBytes("iso-8859-1"), "gbk");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                break;
}
3.到数据库查看结果

这样可能在当前服务器查看参数仍是乱码,但切换到和服务器字符集的服务器登陆此数据库,就可以看到是正确的中文了。


英文字符集.jpeg 中文字符集.jpeg

我们可以发现type-6是以正常中文插入。也就是对应的

new String(name.getBytes(), "iso-8859-1");
4.最终处理
String vName = new String(name.getBytes(), "iso-8859-1");
...//vName进行下一步查询、插入
上一篇下一篇

猜你喜欢

热点阅读