场景:php连接linux的oracle数据库时,发现读取的数据是乱码。用的 sqlplus导入的。编码格式UTF8。
发现问题:用客户端登录oracle后发现,是数据库导入的内容就已经乱码了。
解决过程:
查看oracle数据库编码:
$ sqlplus / as sysdba
SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_CHARACTERSET
al32utf8
查看linux客户端编码
$ env | grep LANG
NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LANG=en_US.UTF-8
查看SQL文件编码
PC UTF8
综上也没看出什么具体问题,解决问题切入点,统一编码。
最终解决流程:
1.修改数据库编码 改为UTF8:
注:字符集最好不要轻易修改,会直接影响数据库的数据!!!
$ conn /as sysdba; #以sysdba登录
SQL> shutdown immediate; #关闭数据库
SQL> startup mount; #用mount打开数据库
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> alter database open; #开启数据库
SQL> ALTER DATABASE CHARACTER SET UTF8; #修改成想要的编码
SQL> shutdown immediate; #关闭数据库
SQL> startup; #开启数据库
2.修改客户端编码 改为UTF8
$ vim .bash_profile #最后add一下两行:
export NLS_LANGUAGE="SIMPLIFIED CHINESE"
export NLS_LANG="Simplified Chinese_china".UTF8
保存wq
$ source .bash_profile #使生效
问题解决。
PS:具体要看用什么编码了,相应改成要的编码,原则是 编码统一