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)