数据库字符集直接查看方法:
select * fromnls_database_parameters;
select * fromv$nls_parameters;
找到 NLS_LANGUAGE_NLS_TERRITORY_NLS_CHARACTERSET
环境变量nls_lang便是由这三部分组成
NLS_LANG = language_territory.charset
比如:NLS_LANG = SIMPLIFIEDCHINESE_CHINA.UTF8
客户终端字符集查看方法:
32位在:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432NODE\ORACLE\KEY_OraDb11g_home1\NLS_LANG
64位在:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1\NLS_LANG
操作:
将ORACLE11g数据库字符集从ZHS16GBK转为UTF8(或AL32UTF8也可以)
步骤一:执行以下命令
sqlplus "/as sysdba"
conn as sysdba;
shutdown immediate;
startup mount;
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
alter database open;
alter database character set UTF8;
shutdown immediate;
startup;
步骤二:执行完毕后,设置客户端字符集:
32位在:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432NODE\ORACLE\KEY_OraDb11g_home1\NLS_LANG
64位在:
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraDb11g_home1\NLS_LANG
按照上述路径找到后设置NLS_LANG的值为SIMPLIFIED CHINESE_CHINA.UTF8
步骤三:最后再设置环境变量NLS_LANG的值为SIMPLIFIED CHINESE_CHINA.UTF8重启电脑即可,然后执行utf8编码的sql脚本不再出现乱码。
总结:
如果“NLS_LANG”等于“数据库字符集”时,不需要进行任何转换,直接把字符插入数据库
如果“NLS_LANG”不等于“数据库字符集”,则需要进行转换,乱码的根源就在这里。
如果“NLS_LANG”编码跟sql脚本一致,则插入数据库的数据基本不会乱码,但是有可能会导致sqlplus中文提示乱码。
如果“NLS_LANG”编码跟sql脚本不一致,和系统一直,则插入数据库的数据可能会乱码,sqlplus中文提示不乱码。