在Redhat上安装Oracle10g没有设定
字符集,采用的是 *** 作系统默认字符集:WE8ISO8859P1,将字符集修改为:ZHS16GBK。由于过程不可逆,首先需要备份
数据库。\x0d\x0a1.数据库全备\x0d\x0a\x0d\x0a2.
查询当前字符集\x0d\x0aSQL>select*fromnls_database_parameterswhereparameter='NLS_CHARACTERSET'\x0d\x0aPARAMETERVALUE\x0d\x0a--------------------------------------------------------------------------------\x0d\x0aNLS_CHARACTERSETWE8ISO8859P1\x0d\x0a\x0d\x0a3.关闭数据库\x0d\x0aSQL>shutdownimmediate\x0d\x0aDatabaseclosed.\x0d\x0aDatabasedismounted.\x0d\x0aORACLEinstanceshutdown.\x0d\x0a\x0d\x0a4.启动数据库到mount状态\x0d\x0aSQL>startupmount\x0d\x0aORACLEinstancestarted.\x0d\x0aTotalSystemGlobalArea205520896bytes\x0d\x0aFixedSize1266608bytes\x0d\x0aVariableSize100666448bytes\x0d\x0aDatabaseBuffers100663296bytes\x0d\x0aRedoBuffers2924544bytes\x0d\x0aDatabasemounted.\x0d\x0a\x0d\x0a5.限制session\x0d\x0aSQL>altersystemenablerestrictedsession\x0d\x0aSystemaltered.\x0d\x0a\x0d\x0a6.查询相关参数并修改\x0d\x0aSQL>showparameterjob_queue_processes\x0d\x0aNAMETYPEVALUE\x0d\x0a-----------------------------------------------------------------------------\x0d\x0ajob_queue_processesinteger10\x0d\x0a\x0d\x0aSQL>showparameteraq_tm_processes\x0d\x0aNAMETYPEVALUE\x0d\x0a-----------------------------------------------------------------------------\x0d\x0aaq_tm_processesinteger0\x0d\x0a\x0d\x0aSQL>altersystemsetjob_queue_processes=0\x0d\x0aSystemaltered.\x0d\x0a\x0d\x0a7.打开数据库\x0d\x0aSQL>alterdatabaseopen\x0d\x0aDatabasealtered.\x0d\x0a\x0d\x0a8.修改字符集\x0d\x0aSQL>alterdatabasecharactersetZHS16GBK\x0d\x0aalterdatabasecharactersetZHS16GBK\x0d\x0a*\x0d\x0aERRORatline1:\x0d\x0aORA-12712:newcharactersetmustbeasupersetofoldcharacterset\x0d\x0a\x0d\x0a出现错误提示,新字符集必须是老字符集的超集,也就原来字符集是新字符集的子集,可以再Oracle官方文档上查询字符集包含关系。下面使用Oracle内部命令internal_use,跳过超集检查,生产环境不建议使用此方法。\x0d\x0a\x0d\x0aSQL>alterdatabasecharactersetinternal_useZHS16GBK\x0d\x0aDatabasealtered.\x0d\x0a\x0d\x0a9.查询当前字符集\x0d\x0aSQL>select*fromnls_database_parameterswhereparameter='NLS_CHARACTERSET'\x0d\x0aPARAMETERVALUE\x0d\x0a--------------------------------------------------------------------------------\x0d\x0aNLS_CHARACTERSETZHS16GBK\x0d\x0a\x0d\x0a10.关闭数据库\x0d\x0aSQL>shutdownimmediate\x0d\x0aDatabaseclosed.\x0d\x0aDatabasedismounted.\x0d\x0aORACLEinstanceshutdown.\x0d\x0a\x0d\x0a11.启动数据库到mount状态\x0d\x0aSQL>startupmount\x0d\x0aORACLEinstancestarted.\x0d\x0aTotalSystemGlobalArea205520896bytes\x0d\x0aFixedSize1266608bytes\x0d\x0aVariableSize100666448bytes\x0d\x0aDatabaseBuffers100663296bytes\x0d\x0aRedoBuffers2924544bytes\x0d\x0aDatabasemounted.\x0d\x0a\x0d\x0a12.将相关参数改回原来值\x0d\x0aSQL>altersystemsetjob_queue_processes=10\x0d\x0aSystemaltered.\x0d\x0a\x0d\x0a13.打开数据库\x0d\x0aSQL>alterdatabaseopen\x0d\x0aDatabasealtered.
一般来说,oracle数据导出spool方式,中文出现乱码,这情况是因为数据库服务器和客户端字符集不匹配,执行sqlplus的机器就是客户端,服务器和客户端也可能是一台机器,执行sqlplus之前要先设置客户端的字符集,在linux上:export NLS_LANG=.......
在windows上set NLS_LANG查询数据库字符集:select property_value from database_properties where property_name like 'NLS_CHAR%'
1、比如查询结果是:ZHS16GBK
那你在sqlplus之前要设置:export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
然后再登录sqlplus用spool生成数据
检查下你导出时候的环境变量,导入时的环境变量
2、比如导出时NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
导入时NLS_LANG没有设置,或者设置为其他字符集,则导入的库内汉字就有可能变成乱码。
解决方法,连接数据库的时候设置正确字符集即可。
评论列表(0条)