在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等。


数据运维技术 » 在Oracle中问号满街走(oracle中文都是问号)