本文摘自GBASE南大通用社区,by:wty,原文请点击:GBase 8s常见问题 -- 字符集相关问题|GBASE社区|天津南大通用数据技术股份有限公司|GBASE-致力于成为用户最信赖的数据库产品供应商
23103 ? Code-set conversion function failed due to an illegal sequence or invalid value.
字符集转换失败,字符串中出现非法字符
1. 数据库是英文字符集,在sysmaster系统库中查sysdbslocale表来确定数据库是什么字符集
[gbasedbt@test ~]$ dbaccess sysmaster -
Database selected.
> select * from sysdbslocale;
dbs_dbsname sysmaster
dbs_collate en_US.819
dbs_dbsname sysutils
dbs_collate en_US.819
dbs_dbsname sysuser
dbs_collate en_US.819
dbs_dbsname sysadmin
dbs_collate en_US.819
dbs_dbsname db_utf8
dbs_collate zh_CN.57372
dbs_dbsname db_gb18030
dbs_collate zh_CN.5488
dbs_dbsname db_en
dbs_collate en_US.819
7 row(s) retrieved.
>
en_US.819 : 英文
zh_CN.57372 :UTF-8 ,同zh_CN.UTF8
zh_CN.5488 : GB18030-2000,兼容gbk,同zh_CN.GB18030-2000
2. 如果是在连接数据库时报此错误,有可能是客户端/jdbc/应用程序放在含有中文的目录中,导致数据无法插入到系统库中,不能正常连接数据库。
-23197 ? Database locale information mismatch.
DB_LOCALE参数或环境变量与数据库不一致
按上面的方法查询数据库的字符集,修改配置
[gbasedbt@test ~]$ dbaccess db_utf8 -
23197: Database locale information mismatch.
[gbasedbt@test ~]$ export DB_LOCALE=zh_cn.utf8
[gbasedbt@test ~]$ dbaccess db_utf8 -
Database selected.
>
-23101 ? Unable to load locale categories.
字符集参数或环境变量配置错误,一般是配置了错误的值,导致无法识别
可以先去掉字符集配置,再按上面的方法查询数据库的字符集,修改配置
[gbasedbt@test ~]$ export DB_LOCALE=zh_cn.utf123
[gbasedbt@test ~]$ dbaccess sysmaster -
23101: Unable to load locale categories.
[gbasedbt@test ~]$ unset DB_LOCALE
[gbasedbt@test ~]$ dbaccess sysmaster -
Database selected.
>
修改现有数据库的字符集
不支持直接修改数据库字符集,需要先将数据库导出,配置新字符集之后,新建数据库或导入数据库
下面举例将utf-8字符集的数据库通过导入导出的方式,重建为gb18030字符集
1. 配置DB_LOCALE、CLIENT_LOCALE环境变量,使用dbexport导出数据库
[gbasedbt@test ~]$ export DB_LOCALE=zh_cn.utf8
[gbasedbt@test ~]$ export CLIENT_LOCALE=zh_cn.utf8
[gbasedbt@test ~]$ dbexport testdb -ss
{ DATABASE testdb delimiter | }
grant dba to "gbasedbt";、
...
dbexport completed
[gbasedbt@test ~]$
2. 删除或重命名原库(如果新库不需要与原库同名,可以跳过此步骤)
重命名:
[gbasedbt@test ~]$ dbaccess sysmaster -
Database selected.
> rename database testdb to testdb1;
Database renamed.
>
删除:
[gbasedbt@test ~]$ dbaccess sysmaster -
Database selected.
> drop database testdb;
Database dropped.
>
3. 修改DB_LOCALE,将刚才导出的数据库导入
如果没有删除/重命名原数据库,需要修改导出文件名为新的库名
1)修改导出的文件夹名:testdb.exp ?> ?testdb1.exp
2)修改数据库对象SQL文件:testdb.sql ?> ?testdb1.sql ? 此文件在导出的文件夹里
3)修改Oracle模式对象SQL文件:testdb_ora.sql ?> ?testdb_ora1.sql ? 此文件在导出的文件夹里(如果没有可以忽略)
*注意:此步骤不要修改CLIENT_LOCALE环境变量,CLIENT_LOCALE环境变量对应的是导出文件的字符集
[gbasedbt@test ~]$ export CLIENT_LOCALE=zh_cn.gb18030-2000
[gbasedbt@test ~]$ dbimport testdb -d datadbs01 -l
{ DATABASE testdb delimiter | }
grant dba to "gbasedbt";
...
dbimport completed
set environment sqlmode 'oracle';
...
set environment sqlmode 'gbase';
[gbasedbt@test ~]$
导入命令:dbimport testdb -d datadbs01 -l
testdb :库名,对应上述导出文件中三个文件的文件名
-d datadbs01 :指定存储的dbspace,使用onstat -d查询dbspace信息
-l :指定导入数据库的日志模式为无缓存日志,不指定默认使用无日志模式,指定有缓存模式使用 -l buffered