oracle数据库字符集为AMERICAN_AMERICA.us7ascii,delphi7读取出来为乱码

时间:2022-04-03 06:32:27
oracle数据库字符集为AMERICAN_AMERICA.us7ascii,delphi7读取中文出来乱码,如何解决,客户的数据库字符集不能更改,只能通过delphi转码,急急

10 个解决方案

#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


好的,我试试看

#5


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

#6


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

#7


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

#8


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

#9


喔喔,我看看,不管怎样,非常感谢您

#10


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


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

#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


好的,我试试看

#5


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

#6


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

#7


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

#8


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

#9


喔喔,我看看,不管怎样,非常感谢您

#10


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


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