我用ADOQuery连接Oracle数据库显示中文的时候是正常的(因为我已经改了注册表里的字符集),但插入中文的时候在数据库里就显示成乱码了,是不是需要把中文转换一下,这个问题该如何解决,望高手指点。谢谢。

解决方案 »

  1.   

    问题就出在你的客户端注册表中修改的字符集和oracle数据库中的字符集不匹配,修改一致后就好了
      

  2.   

    to yongerman
    如何修改呢,我现在的字符集是这样改的
    注册表ORACLE [HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE]"NLS_LANG"="AMERICAN_AMERICA.WE8ISO8859P1"
      

  3.   

    你先修改为:SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
    你试试
      

  4.   

    to yongerman
    不行呀,麻烦再帮想想!谢谢
      

  5.   

    字符集問題需要改到系统的默认字符编码就行了.
    写一个函数:/**////<summary>
    ///将西欧字符编码转换成GB2312
    ///</summary>
    ///<paramname="s"></param>
    ///<returns></returns>
    publicstaticstringConvert8859P1ToGB2312(strings)
    {
    returnSystem.Text.Encoding.Default.GetString(System.Text.Encoding.GetEncoding("iso-8859-1").GetBytes(s));
    } 出现中文乱码的主要原因是字符集不同。在Oracle中,我们关心三个地方的字符集:l Oracle服务器内部的字符集l NLS_LANG变量里保存的字符集l 客户端应用的字符集Oracle服务器内部的字符集这是Oracle数据库存储数据使用的字符集。在Oracle中可能使用Select userenv('language') from dual;或者:Select name, value$ from props$;查看。 
     NLS_LANG变量里保存的字符集这个是Oracle设置的一个变量。在Windows中,这个变量保存在注册表中:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0保存着NLS_LANG变量。 在Unix/Linux中,则需要自己进行设置了。我本人是在.profile里面加上NLS_LANG=AMERICAN_AMERICA.ZHS16GBKexport NLS_LANG  客户端应用的字符集使用Oracle里数据或者向Oracle提供数据的应用程序。 如果 Oracle服务器内部的字符集 和 NLS_LANG变量里保存的字符集 相同,在进行Oracle查询时,就会将Oracle中的数据直接查出来,返回给查询用户。进行Oracle的插入操作,就会直接将插入的数据保存进数据库中。但是如果不同的话,Oracle查询时,会根据这两个字符集的一个映射,将数据库中的数据作一个转换,再返回给查询用户。进行插入操作时,也会根据映射,将插入的数据作一个转换,再插入数据库。这也是产生乱码的原因,这一层转换,把数据都给转乱了。解决办法:
    客户端字符集设置的和数据库端的字符集一样[Q]怎么样查看数据库字符集
    [A]数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。
      客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,
    表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
      会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。
      客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件
      字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是zhs16gbk,则nls_lang可以是American_America.zhs16gbk。
      

  6.   

    你试下以下两种方法:
    一、注册表中,把NLS_LANG的值改为:SIMPLIFIED CHINESE_CHINA.ZHS16GBK二、我的电脑-属性-高级-环境变量,在“系统变量”(注意不是用户变量)下新建变量名:NLS_LANG,变量量为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
      

  7.   

    to zp98572
    我试过了,还是不行,看看能不能在delphi里进行转换呢?
      

  8.   

    如果是在ubuntu下请问怎么更改nls_language?谢谢
      

  9.   

    现在也在纠结这个问题,服务器那边数据库是AMERICAN_AMERICA.WE8ISO8859P1,更新数据库中文部分就变成了‘靠靠’,怎么办 啊?
      

  10.   

      result := TEncoding.GetEncoding('iso-8859-1').GetString(TEncoding.Default.GetBytes(value));
      

  11.   

      result := TEncoding.GetEncoding('iso-8859-1').GetString(TEncoding.Default.GetBytes(value));