oracle数据库字符集为AMERICAN_AMERICA.us7ascii,delphi7读取中文出来乱码,如何解决,客户的数据库字符集不能更改,只能通过delphi转码,急急

解决方案 »

  1.   

    首先要确定是数据库字符集为AMERICAN_AMERICA.us7ascii还是客户端NLS_LANG设置为AMERICAN_AMERICA.us7ascii,如果是后者,这个设置只决定显示,不影响数据库中的实际存储,可以改,不改也可以用rawtohex函数获取原始编码的数据:select rawtohex(xxx) from ...。
    如果是前者(用sqlplus客户端工具连接数据库,输入select * from nls_database_parameters;看看输出),那就比较麻烦了,US7ASCII是7位ASCII编码,最高位是0,所以中文存进去的时候就信息丢失了,读出来也不可能正确。只能写入之前先编码,比如BASE64,读出来之后再解码。
      

  2.   

    您好,非常感谢2楼的回复,服务器数据库字符集就是AMERICAN_AMERICA.us7ascii,这个是确定的,我在客户端的机器里设置环境变量NLS_LANG为SIMPLIFIED CHINESE_CHINA.US7ASCII后,通过PLSQL查询是可以显示中文了,但通过delphi不知道如何转换,中文读取出来都是乱码
      

  3.   

    那你把NLS_LANG为SIMPLIFIED CHINESE_CHINA.UTF8,D7读出来UTF8Decode再显示。
      

  4.   

     edit2.text:=Utf8Decode(YlQuery_Data['payer']); 还是乱码,我用的数据连接组件是unidac ,我这里设置  UniConnOracle.SpecificOptions.Values['Charset'] := 'SIMPLIFIED CHINESE_CHINA.UTF8'; 还是不行,
      

  5.   

    那应该就是数据写入数据库时就丢失信息了,你只能先用兼容US7ASCII的编码比如BASE64先编码再写入,读取后先解码再显示。
      

  6.   

    但是通过plsql连接,直接查询是可以显示中文的,问了他们开发商说他们显示也是没问题,我们只能读取他们的数据
      

  7.   

    那你别用D7了,换D2009+支持unicode的版本。
      

  8.   


    这样啊,那你可以用rawtohex函数获取数据编码看看,和已知数据比较一下。
      

  9.   

     当数据库是英文字符集时,他的原始编码如果不是GBK,是很容易乱码的,这时就如楼上所说,dump一下中文字段,看看其原始编码到底是什么 ,如果不是已知的编码,那极有可能是存储时发生了转换,这时,只有你把环境设置为数据来源一致时,才能解决。这种情况是编码丢失,但内容还能还原,即使是GBK编码,DUMP出来也不是GBK。觉的没几种,一试便知
      

  10.   

    用PL改几下NSL_LANG就能试出来
      

  11.   

    这是系统字符集的问题。
    根本的解决办法,使用Delphi2010。
      

  12.   

    我倒是觉得UniConnOracle.SpecificOptions.Values['Charset']应该设置成ASCII才对