在Oracle中问号满街走(oracle中文都是问号)
在Oracle中:?问号满街走
在Oracle中,当我们查询某张表时,常常会遇到如下的问题:使用SELECT语句查询时,会出现“?”问号的情况,即查询的结果中会出现类似“????????”的乱码字符。
这种情况一般是由于Oracle数据库字符集与数据库客户端字符集不一致所引起的。Oracle数据库支持多种字符集,包括ISO8859P1、UTF-8和GB2312等等。
在进行查询时,如果Oracle数据库中的表使用的字符集和客户端使用的字符集不同,就会出现上述的乱码现象。因此,解决这个问题的方法就是统一Oracle数据库字符集和数据库客户端字符集。
如何设置Oracle数据库字符集和数据库客户端字符集呢?下面就为大家介绍一下具体的设置方法。
1、设置Oracle数据库字符集
我们可以通过以下3个步骤来设置Oracle数据库字符集。
(1)查看Oracle数据库当前的字符集
我们可以使用如下SQL语句来查看当前Oracle数据库采用的字符集:
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE ‘NLS_%CHARACTERSET’;
这条SQL会查询NLS_DATABASE_PARAMETERS视图中,PARAMETER列以“NLS_%CHARACTERSET”开头的数据行。
在查询结果中,我们可以看到当前Oracle数据库使用的字符集是“AL32UTF8”(Oracle Universal character set)。
(2)更改Oracle数据库字符集
要更改Oracle数据库字符集,需要以SYS用户身份登录Oracle数据库,并执行以下操作:
a) 在Oracle家目录下找到admin目录,在其中创建pfile目录,如下所示:
$cd /u01/app/oracle/product/10.2.0/db_1
$mkdir admin/pfile
b) 从Oracle数据库中导出参数文件。
$cd $ORACLE_HOME/dbs
$sqlplus /nolog
SQL>CONNECT SYS AS SYSDBA
Enter password:
SQL>CREATE PFILE=”/u01/app/oracle/product/10.2.0/db_1/admin/pfile/init.ora_copy” from spfile;
c) 打开参数文件进行编辑,将其中的NLS_CHARACTERSET参数设置为需要的字符集。
$cd /u01/app/oracle/product/10.2.0/db_1/admin/pfile
$vi init.ora_copy
将参数文件中的NLS_CHARACTERSET参数的值修改为所需的字符集,例如:
NLS_CHARACTERSET=GB2312
d) 通过参数文件创建新的SPFILE
SQL>CREATE SPFILE=”/u01/app/oracle/product/10.2.0/db_1/dbs/spfile”
从参数文件创建SPFILE。
e) 关闭Oracle数据库并重新启动
SQL>SHUTDOWN IMMEDIATE;
SQL>STARTUP;
(3)验证Oracle数据库字符集是否更改成功
我们可以通过如下SQL语句来验证Oracle数据库字符集是否成功更改:
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE ‘NLS_%CHARACTERSET’;
如果我们看到查询结果中,NLS_CHARACTERSET的值已经变成了我们所设定的字符集,那么就说明Oracle数据库字符集已经成功更改了。
2、设置数据库客户端字符集
要设置数据库客户端字符集,我们需要在客户端的环境变量中添加NLS_LANG参数,并将其值设为所需的字符集。下面是具体的步骤:
(1)查看当前数据库客户端字符集
$echo $NLS_LANG
该命令会显示当前的NLS_LANG参数设置情况,例如:
AMERICAN_AMERICA.AL32UTF8
(2)重新设置数据库客户端字符集
要重新设置数据库客户端字符集,需要编辑系统环境变量文件/etc/profile,添加如下一行:
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
其中,“AMERICAN_AMERICA”是语言、地区和字符类型,“ZHS16GBK”是字符集名称。
编辑完之后,保存并退出/etc/profile文件,然后执行以下脚本,刷新环境变量。
$source /etc/profile
(3)验证数据库客户端字符集是否更改成功
我们可以执行如下命令来验证数据库客户端字符集是否成功更改:
$echo $NLS_LANG
如果我们看到输出结果已经改为我们设定的字符集,那么就说明数据库客户端字符集已经成功更改了。
综上所述,只要我们按照以上方法设置好Oracle数据库字符集和数据库客户端字符集,就不会再遇到“?”问号的情况了。当然,如果Oracle数据库中的表数据一旦存在乱码,那么不同字符集之间的转换就比较困难,需要使用一些专门的工具进行处理,比如iconv等。