场景:
数据库好好的,升级之后所以失效,sql跑不出来了。
之前有遇到过,字符集编码修改导致索引失效的问题,所以按照这个思路排查下。
查看字符集
这里说的是查看oracle的字符集,这两条语句也可以在sqlplus里面执行,查看当前session的字符集。
#查看字符集
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';
这个命令也可以。
SELECT VALUE FROM V$NLS_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
查看服务器的字符集
操作步骤:
bash环境下执行该命令。
echo $NLS_LANG;
如果为空,说明走的是默认字符集,有一种说法如果不指定,默认字符集是AMERICAN_AMERICA.US7ASCII。
locale查看命令列表。
>locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
修改字符(谨慎操作)
修改字符集应该可以解决问题,但是需要谨慎操作,会影响数据。
修改字符集的命令:
ALTER DATABASE CHARACTER SET AL32UTF8; # 修改字符集的命令
此命令有可能会报错:ORA-12712: 新字符集必须为旧字符集的超集。
那么使用如下命令强制修改:
ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8; #
修改当前session的字符集
永久修改风险太大,非常不推荐。
比较好的方案是修改当前session的字符集,这样只影响当前执行的语句。
该方案实测有效,解决了问题。
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8;
百度有说这个也是可以的,未实测,作为备选方案吧。
ALTER SESSION SET NLS_LANG=AMERICAN_AMERICA.AL32UTF8;
还有一个问题,这条命令在oracle用户下执行呢? 还是在sqlplus命令行里面执行呢?
经确认,是在sqlplus执行前执行,表示设置当前session。

9218

被折叠的 条评论
为什么被折叠?



