首页 » ORACLE 9i-23ai, PostgreSQL/GaussDB » Oracle国产化改造迁移时的问题: Varchar data type中的 invalid 字符集字符编码

Oracle国产化改造迁移时的问题: Varchar data type中的 invalid 字符集字符编码

最近在从orale迁移到Postgresql系的数据库时,迁移工具(Java JDBC)几张表迁移失败,源库和目标都是GBK字符集,但在迁移过程中提示ERROR: character with byte sequence 0xe4 0xb8 0xad in encoding “UTf8” has no equivalent in encoding “GBK”,说明在GBK数据库中有部分列数据的值是UTF8编码,这种以GBK字符集查询会乱码,验证在源库入库时错误,迁移时需要注意。

提示字符编码”0xe4 0xb8 0xad”编码是UTF8,而不是GBK,只是部分记录,从源库查询发现也是部分记录的部分列乱码。去年曾经还想研究一下如何遍历数据库,如何高效的找出所有无效字符的专利,像之前写过的2篇无效Number,无效date,这里的无效字符集编码。使用函数dump查看列的编码

sys@ORA19C 13:19:26> select * from database_properties where PROPERTY_NAME like '%CHAR%'

PROPERTY_NAME                            PROPERTY_VALUE                           DESCRIPTION
---------------------------------------- ---------------------------------------- --------------------------------------------------
NLS_NCHAR_CONV_EXCP                      FALSE                                    NLS conversion exception
NLS_NUMERIC_CHARACTERS                   .,                                       Numeric characters
NLS_NCHAR_CHARACTERSET                   AL16UTF16                                NCHAR Character set
NLS_CHARACTERSET                         AL32UTF8                                 Character set


sys@ORA19C 13:20:00> create table testchar(v varchar2(10));
Table created.

sys@ORA19C 13:20:07> insert into testchar values('中国');
1 row created.

sys@ORA19C 13:20:27> select v,dump(v,1016) from testchar;
V
----------
DUMP(V,1016)
-------------------------------------------------------   
中国
Typ=1 Len=6 CharacterSet=AL32UTF8: e4,b8,ad,e5,9b,bd

生产环境验证

Note:
记录显示是ZHS16GBK字符集

查看编码值

Note:
确实是有效的UTF8编码, 在oracle可以使用covert函数转换字符集,如下

select convert(nm,'ZHS16GBK','AL32UTF8') FROM test;

转换后正常显示,通知应用修正。

因为迁移工具使用的JDBC 驱动默认是使用UTF8,所以在迁移过程中要转码,配置参数与源库一致,不做转码,就可以入库,但是目标库字符编码与源库一样,入库后依旧查询时是乱码。在PG中有client_encoding参数可以临时客户端字符集。

打赏

, ,

目前这篇文章还没有评论(Rss)

我要评论