大家好,
  我现装了oracle19g 在linux as4下,我客户端是装在widows下, 我注册表中客户端编码为:AMERICAN_AMERICA.AL32UTF8
我在linux下用plsqlplus ,用select userenv('language') from dual 查询出的数据库编码也为:AMERICAN_AMERICA.AL32UTF8
我现在linux下用insert tt(pid,code,name) values(1,'a','中文')插入数据后,在linux下和windows下plsql develop查询都可以正常显示中文值,
但如果我在windows下用plsql develop插入insert into(pid,code,name) values(2,'b','中文')插入数据后,在windows下用plsql develop查询可以查询到中文信息如下:
1 a 中文
2 b 中文 
,但当查询时,plsql develop会提示如下信息:
One or more UTF8 fields contain non-UTF8 data,editing might give unexpected results,但如果我在linux下用sqlplus查询这个表,用select * from tt时,刚才在windows下插入的2,'b,'中文' 这条数据,会显示乱码,显示结果如下:
1 a 中文
2 b 涓第二条数据在windows下显示是正常的,但linux下这条数据不能正确显示。请帮一下。
谢谢!

解决方案 »

  1.   

    create table t(cname nvarchar2(30));insert into t values(N'中文');
    试试看
      

  2.   

    我没有环境来测试,会不会是因为两个操作系统对中文存储的不同?
    我是说,你的windows所传递的数据到了linux被截断了?操作系统对该字符集解析的原因?
    以上是我的个人推测,需要验证.
      

  3.   

    linux下执行:
    export NLS_LANG=AMERICAN_AMERICA.AL32UTF8然后再查询看看.
      

  4.   

    One or more UTF8 fields contain non-UTF8 data,editing might give unexpected results 
    一个或多个UTF8的域包含非UTF8的数据,编辑后可能会得到不正确的结果
    是不是带空格了。你换成其他文字试试。
      

  5.   

    也遇上过这种问题,很无耐.
    一是在开发时指定unicode,在操作时莫忘了N'unicode';
    另一种则得看软件使用的操作系统(本地语言)还是其他语言,本地语言和数据库语言不同很可能造成乱码现象.
      

  6.   

    如果本地和数据库语言不同,则需要在软件中指定语言.plsql是在安装时指定的,不知道怎么更改
      

  7.   

    to oracledbalgtu ,
    谢谢,我按你的设置了,export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 
    但是设完后,当我在linux下 conn ms/oracle 想连数据库时,提示如下错误信息,不能连接了。
    ORA-12705:cannot access NLS data fiels or invalid environment specified
      

  8.   

    to hyrongg ,
      我在windows下执行了下面的语句,
       insert into tt(pid,code,name) values(3,'c',N'中文');当我在windows下用plsql develop工具查询这个tt表时,可以显示这个中文,不会显示器“涓”这个乱码。但当我在linux下用sqlplus查询时,就会把这条记录显示成 "涓" 了。帮一下了,难道这个入门问题大家都没碰到过吗?谢谢!
      

  9.   

    再查询一下服务器端配置的字符集。在sqlplus中以dba用户执行:   
      select   tab1.aa||'_'||tab2.bb||'.'||tab3.cc   from   (select   VALUE$   aa   from   sys.props$   where   name='NLS_LANGUAGE')tab1,(select   VALUE$   bb   from   sys.props$   where   name='NLS_ISO_CURRENCY')tab2,(select   VALUE$   cc   from   sys.props$   where   name='NLS_CHARACTERSET')tab3;   看是否是AMERICAN_AMERICA.AL32UTF8? 
      

  10.   

    to BlueskyWide ,
       谢谢,我执行了你的sql语句,显示还是AMERICAN_AMERICA.AL32UTF8是不是linux下sqlplus客户端的编码问题,但我不知道该怎样改变它.
      

  11.   

    ORA-12705: "invalid or unknown NLS parameter value specified" Cause: There are two possible causes: - An attempt was made to issue an ALTER SESSION statement with an invalid NLS parameter or value.- The NLS_LANG environment variable contains an invalid language, territory, or character set. Action: Check the syntax of the ALTER SESSION command and the NLS parameter, correct the syntax and retry the statement, or specify correct values in the NLS_LANG environment variable. 
      

  12.   

    是不是UTF8字符本身有问题?或是安装不当使之出现non-UTF8 data?
    如果现在数据不太重要的话,换个较通用的字符集吧!update sys.props$ set  value$='AMERICAN_AMERICA.US7ASCII' where name='NLS_CHARACTERSET'; 或
    update sys.props$ set  value$='AMERICAN_AMERICA.WE8ISO8859P1' where name='NLS_CHARACTERSET';
    修改后服务器重启,并使客户端与其保持一致。再试试看。
       
      

  13.   

    因服务器数据库存贮无误,只是在不同状况下显示有点问题,因程序大都在windos终端上显示,如不修改,也无关系。
    若要改,先exp有用的数据,谨慎地修改。字符集的修改:   
    修改只能由子集向超集改,象下面:   
      US7ASCII   ->WE8ISO8859P1   
      US7ASCII   ->ZHS16GBK     
      US7ASCII   ->UTF8     
    具体步骤为:
        
      SQL>   STARTUP   MOUNT;    --启动数据库 
      SQL>   ALTER   SYSTEM   ENABLE   RESTRICTED   SESSION;   
      SQL>   ALTER   SYSTEM   SET   JOB_QUEUE_PROCESSES=0;   
      SQL>   ALTER   DATABASE   OPEN;   
      SQL>   ALTER   DATABASE   CHARACTER   SET   <new_character_set_name>;   
      SQL>   SHUTDOWN   IMMEDIATE;   --   or   NORMAL   
      SQL>   STARTUP;