本机没安oracle 安装了PLSQL和client ,查询刚才插入表中的中文数据却显示“?”是怎么一回事,说详细点,本人刚接处,基本上什么吗都不懂!哈哈!

解决方案 »

  1.   

    字段的数据类型是什么? 用nvarchar试试.
      

  2.   

    你的客户端NLS_LANG是英文,而数据库的NLS_LANG是中文,你只需注册表中NLS_LANG改为中文即可。HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0"NLS_LANG"值改为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
      

  3.   

    oracle 10g装上后,建了个表写入中文数据,发现通过工具DbVisualizer 6.5 写入/读取中文都正常,就sqlplus和PL/SQL Developer不正常.初步怀疑是DbVisualizer本身定义了字集编码,而sqlplus和PL/SQL Developer则没有.无论怎么样,要正常显示中文,就必须得服务器和客户端编码一致才行.于是检查.1.检查服务器编码:执行SQL语法:select * from v$nls_parameters;也可以参照/home/oracle/.bash_profile 相关语言设置.
    可以看到我的相关设置是:LANG=zh_CN.GBK  
    NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"2.设置本地客户端编码:进入 我的电脑,属性,高级,环境变量,添加2项:LANG=zh_CN.GBK  
    NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"如图:
    3.重新连接sqlplus,查看数据:显示正常.4.PL/SQL Developer设置并重新连接:在pl/sql developer的菜单->tools->preferences->user interface->fonts 中修改为中文字体重新连接显示正常.OK!
      

  4.   

    有什么不一样吗?
    CREATE TABLE students (
      id               NUMBER(5) PRIMARY KEY,
      first_name       VARCHAR2(20),
      last_name        VARCHAR2(20),
      major            VARCHAR2(30),
      current_credits  NUMBER(3)
      );INSERT INTO students (id, first_name, last_name, major,
                          current_credits)
      VALUES (student_sequence.NEXTVAL, 'leming', 'mao',
              '计算机科学', 11);select *from students;-------->应该显示的汉字却是“?”!
      

  5.   

    把 major 改为NVARCHAR2(30)试试呢?
      

  6.   

    1、修改server端字符集(不建议使用)在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系
    统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:$sqlplus /nologSQL>conn / as sysdba;   若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服
    务器,然后执行以下命令:SQL>STARTUP 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 ZHS16GBK;SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,
    不然不能start) 
    按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 
    这样的提示信息要解决这个问题有两种方法一个是,利用INTERNAL_USE 关键字修改区域设置,还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP MOUNT EXCLUSIVE;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 national character set internal_use utf8;SQL>alter database character set internal_use zhs16gbk;SQL>SHUTDOWN immediate;SQL>startup;如果按上面的做法做,National charset的区域设置就没有问题2、修改dmp文件字符集上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。
    这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,
    如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:   
    SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;0354然后将dmp文件的2、3字节修改为0354即可。如果dmp文件很大,用ue无法打开,就需要用程序的方法了1.操作系统认证:即oracle认为操作系统用户是可靠的,即既然能登陆到操作系统那么oracle数据库你也能登陆
    2.口令文件认证:oracle认证认为操作系统用户是不可信任的,如果要访问数据库,必须进行再次认证。具体实现如下:
    1.操作系统认证:
    配置sqlnet.ora文件中的参数:SQLNET.AUTHENTICATION_SERVICES=(NTS)
             spfile(pfile)文件参数:REMOTE_LOGIN_PASSWORDFILE=('NONE')
    这个时候,只要你登陆操作系统oracle用户后,就可以直接conn /as sysdba登陆数据库了。但是不能通过oracle的client去
    直接连接/as sysdba。如客户端SQLPLUSw或者其它客户端软件直接conn /as sysbd 。2.口令文件认证:
    配置sqlnet.ora文件中的参数:SQLNET.AUTHENTICATION_SERVICES=(NONE)
       spfile(pfile)文件参数: REMOTE_LOGIN_PASSWORDFILE=('EXCLUSIVE')或('SHARED')
    这个时候需要配置口令文件PWDorcl.ora。(orcl为数据库SID)可以通过orapwd命令进行配置口令,
    具体用法man orapwd。
    这种情况下,就是口令认证模式,不能使用本地用户conn /as sysdba 这个时候会报错:ORA-01031 权限不足。
    你必须使用conn sys/pwd@orcl as sysdba进行登陆:就是说必须提供用户名和密码才能登陆。(orcl 为SID)
      

  7.   

    1、修改server端字符集(不建议使用)在oracle 8之前,可以用直接修改数据字典表props$来改变数据库的字符集。但oracle8之后,至少有三张系
    统表记录了数据库字符集的信息,只改props$表并不完全,可能引起严重的后果。正确的修改方法如下:$sqlplus /nologSQL>conn / as sysdba;   若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服
    务器,然后执行以下命令:SQL>STARTUP 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 ZHS16GBK;SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是ORACLE支持,
    不然不能start) 
    按上面的做法就可以,但是可能会出现‘ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTER SET when NCLOB data exists’ 
    这样的提示信息要解决这个问题有两种方法一个是,利用INTERNAL_USE 关键字修改区域设置,还有一个是利用re-create,但是re-create有点复杂,所以请用internal_use,SQL>SHUTDOWN IMMEDIATE;SQL>STARTUP MOUNT EXCLUSIVE;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 national character set internal_use utf8;SQL>alter database character set internal_use zhs16gbk;SQL>SHUTDOWN immediate;SQL>startup;如果按上面的做法做,National charset的区域设置就没有问题2、修改dmp文件字符集上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。
    这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,
    如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:   
    SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;0354然后将dmp文件的2、3字节修改为0354即可。如果dmp文件很大,用ue无法打开,就需要用程序的方法了1.操作系统认证:即oracle认为操作系统用户是可靠的,即既然能登陆到操作系统那么oracle数据库你也能登陆
    2.口令文件认证:oracle认证认为操作系统用户是不可信任的,如果要访问数据库,必须进行再次认证。具体实现如下:
    1.操作系统认证:
    配置sqlnet.ora文件中的参数:SQLNET.AUTHENTICATION_SERVICES=(NTS)
             spfile(pfile)文件参数:REMOTE_LOGIN_PASSWORDFILE=('NONE')
    这个时候,只要你登陆操作系统oracle用户后,就可以直接conn /as sysdba登陆数据库了。但是不能通过oracle的client去
    直接连接/as sysdba。如客户端SQLPLUSw或者其它客户端软件直接conn /as sysbd 。2.口令文件认证:
    配置sqlnet.ora文件中的参数:SQLNET.AUTHENTICATION_SERVICES=(NONE)
       spfile(pfile)文件参数: REMOTE_LOGIN_PASSWORDFILE=('EXCLUSIVE')或('SHARED')
    这个时候需要配置口令文件PWDorcl.ora。(orcl为数据库SID)可以通过orapwd命令进行配置口令,
    具体用法man orapwd。
    这种情况下,就是口令认证模式,不能使用本地用户conn /as sysdba 这个时候会报错:ORA-01031 权限不足。
    你必须使用conn sys/pwd@orcl as sysdba进行登陆:就是说必须提供用户名和密码才能登陆。(orcl 为SID)