最近写的程序需要操作oracle ,用sqlapi++来连接数据库的,但现在发现,在一台机器上试行的时候用程序插入和读取中文字符 就是乱码,,当然在我的机器上用的时候是显示正确的,
   在SQL Plus WorkSheet中执行select userenv ('language') from dual   ,获得的是  SIMPLIFIED CHINESE_CHINA.ZHS16GBK 然后查看了机器注册表中   HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG  值为 NULL ,homo0下NLS_LANG为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 
IDO 下NLS_LANG   也为NULL ,SQL Plus WorkSheet 中用 Insert 和Select 得到的中文都是显示正常的,但用我的程序 Insert 和Select 的结果就不正常了,程序连接前已将 charset
设置为ZHS16GBK ,,不知道怎么弄了。 

解决方案 »

  1.   

    服务器中的字符集是不需要改的。
    所有连接的客户端的字符集(hom0)要设置为服务器中的字符集。
      

  2.   

    SQL Plus WorkSheet中执行select userenv ('language') from dual  ,获得的是  SIMPLIFIED CHINESE_CHINA.ZHS16GBK 
     说明服务器的字符集是 ZHS16GBK  吧,我把注册表中  HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE,ID0和 homo0下的 NLS_LANG都改为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 了,
    在程序中 Insert 和select的结果还是不正常,SQL Plus WorkSheet中 执行Insert和Select的结果一切正常
      

  3.   

    那么客户端的字符集应该怎么改呢?客户端的注册表下 homo0 下的NLS_LANG 以设置为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK 了今天又试了下,在ORACLE中  SQL*PLUS worksheet  中运行 
     Select userenv (‘language’) from dual;得到的是:SIMPLIFIED CHINESE_CHINA.ZHS16GBK在我的c++程序中运行以上SQL命令,得到的确是  AMERICAN_AMERICA.ZHS16GBK
      

  4.   

    我机器上Oracle客户端显示的是:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    注册表中:
    HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/NLS_LANG 值为NA
    HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/ID0/NLS_LANG 值为NA
    HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE/HOME0/NLS_LANG 值为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    你改一下,看看行不?
      

  5.   


    如果这样设置还不行的话,根据你最开始的描述估计是的程序的问题吧
    (你的filter和页面中的字符集是否一致?)
    ……