oracle字符集的使用(修改字符集可能导致索引失效)、解决乱码问题

场景:
数据库好好的,升级之后所以失效,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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值