医院信息系统Oracle数据库中导入数据中文乱码的解决技术
2017-03-03宫彦婷
宫彦婷
医院信息系统Oracle数据库中导入数据中文乱码的解决技术
宫彦婷①
目的:根据数据库的US7ASCII字符集使用受限的实际情况,将医院信息系统(HIS)数据库字符集转换成为ZHS16GBK码,保证导入数据库文件后,汉字显示正常。方法:在数据库字符集和数据库导入、导出程序功能的基础上,使用该工具和文本编辑器完成数据库字符集的转换。结果:通过实际测试给出了一套字符集升级、避免中文显示乱码的解决方案。结论:HIS数据库版本升级时,应做好字符集选择测试,避免引起汉字显示乱码的问题。
数据库字符集;Oracle数据库;医院信息系统
[First-author’s address]Information Department, The PLA General Hospital, Beijing 100700,China.
医院信息系统(hospital information system,HIS)已经成为保障医院正常运转的关键因素,其承载了医院门诊挂号收费、医生站、住院管理及检查检验等核心业务。Oracle数据库是医院HIS系统的基础,其安全、稳定以及先进性将直接影响到医院的正常医疗活动,对保障医疗质量,提升工作效率具有重要作用[1-3]。
Oracle数据库在数据库升级或数据迁移时,通常选用导入导出实用程序,既可解决不同种或不同版本操作系统、不同版本数据库的数据移动,还可实现数据物理存储结构的重整[4]。
在Oracle数据库的实际应用中,与字符集问题关系最大的则是导入导出,即exp/imp工具。在进行exp/imp时,如果客户端和服务器端的nls_lang设置一样,则无问题。但是,要在2个不同字符集的系统之间导数据则常会出现不成功的现象,如导出数据库时正常时为中文显示,当导入到其他系统时则变成了乱码;还有一类是从Oacle11g开始,Oracle公司不再支持us7ascii字符集,广泛使用zhs16gbk字符集,以往被广泛使用的us7ascii字符集在11 G中将不能被选择,取而代之的是zhs16gbk字符集(Oracle优选),这样使用导入后汉字一定为乱码。
随着数字化医疗的进步,支持ascii字符集的数据库在使用上出现越来越多的弊端[5]。医院的信息系统数据库使用的是Oracle 10g,采用us7ascii字符集,拟升级到oracle 11g,需要采用zhs16gbk字符集,通过本研究的方法,测试导入数据库文件后汉字显示正常。
1 数据库字符集与导入导出概念
1.1 数据库字符集
当数据库一旦创建后,其数据库的字符集不能够改变。因此,在设计和安装之初考虑使用的字符集种类十分重要。数据库字符集应该是操作系统本地字符集的一个超集。存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。Oracle数据库中与字符集有关的NLS_ LANG参数如下。
NLS_LANG格式:
NLS_LANG=language_territory.charset
由语言、地域和字符集三部分组成,每部分控制了NLS子集的特性。其中,language指定服务器消息的语言,territory指定服务器的日期和数字格式,charset指定字符集。
例如:
AMERICAN_AMERICA.US7ASCII
AMERICAN_AMERICA.ZHS16GBK等。
1.2 导入导出
Oracle数据库导入导出imp/exp相当于oracle数据还原与备份。Exp命令可将数据从远程数据库服务器导出至本地的dmp文件,imp命令可将dmp文件从本地导入至远处的数据库服务器中。利用该功能可构建2个相同的数据库,一个用来测试,另一个用来正式使用。
2 查询Oracle字符集的方法
在Oracle数据库的应用中,通常会遇到由于字符集不同而使数据导入失败的情况,其涉及三方面的字符集:①oracel server端的字符集;②2.oracle client端的字符集;③3.DMP文件的字符集。在进行数据导入时,需要将3个字符集一致导入后方不会出现乱码。
2.1 查询oracle server端的字符集
有许多种方法可查出oracle server端的字符集,较为直观的查询方法是使用SQL*PLUS[6]其结果如下。
SQL>select userenv('language')from dual;
查询结果是:userenv('language')
American_america.us7ascii
2.2 确定oracle client端的字符集
在客户端通过import导入Oracle的dmp文件,如客户端的字符集与dmp文件对应的数据库字符集不一致时,可能会导致导入的数据乱码。此时可通过修改注册表来设置客户端的字符集,以避免乱码的发生[7-8]。在windows平台运行下执行regedit,查看注册表里的HKEY_LOCAL_MACHINESOFTWARE ORACLEKEY_OraClient10g_home1NLS_ LANG,查询并进行修改,其结果为:American_ america.us7ascii。
2.3 如何查询DMP文件的字符集
采用oracle的Exp工具导出的DMP文件包含字符集信息,如果DMP文件很大,有数十个G以上的为常见情况,使用文本编辑器打开文件很慢或者完全打不开,可以采用UltraEdit进行编辑。DMP文件第一行的第2和第3个字节和第三行第14、15、16字节、第4行的第1个字节记录了DMP文件的字符集(如图1所示)。
图1 导出后未修改的dmp文件界面图
有些资料提出只要修改第1行的第2、3个字节即可以“骗过”Oracle的imp命令,经过测试该方法的结果不正确。
3 数据库字符集与导入实施方案
将2台服务器命名为A机、B机。A机数据库服务器为oracle10g,System管理员的账号是system,全局数据库名为dbserver,字符集us7ascii。B机数据库服务器为oracle11g,System管理员的账号是system,全局数据库名为dbserver,字符集为zhs16gbk;其安装路径完全同A数据库服务器。
3.1 确定在用B数据库服务器的字符集
登陆plsql,输入如下脚本:SQL>select userenv('language')from dual;结果:simplified chinese_china,zhs16gbk.
3.2 导出文件
在执行环境中,可以在SQLPLUS.exe或者DOS命令行中执行。Exp(卸出)将数据库内的各对象以二进制方式下载成dmp文件,方便数据迁移[9]。使用管理员账号登陆A数据库服务器。输入:Expsystem/manager@ dbserver file=d:z.dmp full=y log=e:123.log;导出文件时间非常长,约为10余小时。
3.3 使用UltraEdit工具
由于医院的数据库导出后文件巨大,在100 G左右,因此使用普通的文本编辑工具无法打开。使用UltraEdit工具来编辑导出的文件(大约在40~60 min),其结果显示如图2所示。
图2 修改字符集且导入新库的dmp文件界面图
图2 中划圈部分原来的数值为0001(16进制),将第一行第2、3列的0001改为0354(0001表示us7ascii字符集,0354表示zhs16gbk字符集),将第三行第14、15、16列、第4行第1列的2个0001分别改为0354。注意,在第4行的第4、5列还有一处0001,此处的值不能修改,否则oracle在导入时报错。修改完这3处后保存文件,可以确保“骗过”Oracle的检查。
3.4 导入
Imp(导入)将Exp下载的dmp文件上载到数据库内。输入:Imp system/manager@ dbserver file=d:z.dmp full=y ignore=y log=e:123. log;尤其应该注意新安装的oracle11g的安装路径需要与原服务器的路径绝对一致,否则导入不会成功。
此处应注意:导入成功后不可马上重启操作系统,应立即更换管理员的口令(sys、system、sysman),然后再重启计算机。以免引起不必要的麻烦。如:①Alter user system identified by 77108;②Alter user sys identified by 77108;③Alter user sysman identified by 77108。
3.5 重启计算机
进入plsql,测试中文显示是否正常,不存在乱码,可以通过查询某一张数据库表来测试,如查询工作人员字典Select * from staff_dict a。
4 结语
医院数据库从Oracle7开始一直使用us7ascii字符集,从oracle8i升级到oracle10g时未遇到任何问题。随着医院影像楼、新医疗大楼的陆续启用,面临数据库从10 G升级到11 G。实验表明,一旦将数据库从10 G升级到11 G必将引起汉字显示乱码。为此,通过大量的测试后消除了升级所引起的汉字显示乱码问题。因此,一旦升级到高版本的数据库版本时,若字符集选择不正确或不再支持某个字符集,必将引起汉字显示乱码问题。
[1]宫彦婷,常建国,王彪,等.Oracle安全网关技术在医院内网安全中的研究与应用[J].中国医学装备,2012,9(4):11-14.
[2]李超峰,马嘉潜,肖华锋,等.HIS系统数据库跨平台迁移实践[J].中国数字医学,2016,11(8):86-88.
[3]焦雄飞,孙国志,李子涛,等.医院信息系统集成与交换平台一体化建设方案的研究[J].中国医学装备,2016,13(8):82-85.
[4]刘微,刘志敏.Oracle数据库数据导入导出实用程序的评测[J].中国数字医学,2012,7(11):65-67.
[5]庄绍燕,杨保卫.“军卫一号”数据库字符集升级[J].中国医疗设备,2013,28(11):54-55.
[6]龚维荣,周顺平,万波.浅谈Oracle数据库基于索引的SQL语句优化方法[J].计算机工程与应用,2003,39(5):196-199.
[7]曹新志,沈君姝,郭辉,等.Oracle数据库在PACS/RIS系统中的应用[J].中国医疗设备,2013,28(7):35-37.
[8]谈永奇,候道勇.基于Oracle的数据复制技术在HIS中的应用[J].医疗卫生装备,2010,31(10):66-67.
[9]吴淑玮,闫训超,曹齐.企业级信息系统数据迁移[J].计算机系统应用,2013,22(7):53-57.
The technology solution about Chinese garbled during importing data in the Oracle database of hospital information system/
GONG Yan-ting//China Medical Equipment,2017,14(2):90-92.
Objective:To convert the HIS database character set into ZHS16GBK code in order to ensure Chinese character can be normally displayed after data were imported.Methods:Used the tool and text editor to complete the conversion of database character set which based on the basis of database character set and the functions of database import and export procedures.Results:By actual test, this research provide a set of technology solutions can upgrade character set and avoid Chinese display garbled.Conclusion:In order to avoid Chinese characters display garbled, actual test of character set would been finished before the database version is upgraded.
Database character set; Oracle database; Hospital information system
1672-8270(2017)02-0090-03
R197.324
A
10.3969/J.ISSN.1672-8270.2017.02.027
2016-11-15
①陆军总医院信息科 北京 100700
宫彦婷,女,(1973- ),硕士,副主任技师。陆军总医院信息科,从事医院信息化系统的设计与应用的研究工作。