我的服务器端和客户端的字符集都是AMERICAN_AMERICA.WE8ISO8859P1,可是我组织的更新语句直接拿到数据库里能执行,正确显示中文,可是在程序中实现更新数据库时,中文就变成了靠靠靠之类的乱码,这是怎么回事呢?大侠们帮帮忙啊,一直催着改好!!!!

解决方案 »

  1.   

    -- 请参考:-- 3.8 “靠”字的困惑 ( P109 )......-- *(1) 客户端应用字符集(Client Application Character Set)。测试客户端应用使用命令行工具(cmd.exe),
    --      这个工具的字符集决定查询结果在终端上的输出显示,当前命令行工具的字符代码页为936,对应的是GBK字符集,如图3-11所示。
    D:\> cmdD:\> chcp-- *(2) 客户端NLS_LANG参数设置。为了测试异常情况,设置NLS_LANG为AMERICAN_AMERICA.WE8ISO8859P1:
    D:\> set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1-- *(3) 服务器端,数据库字符集(Character Set)设置。其数据库的字符集为ZHS16GBK。-- 首先在数据库上创建一个测试表,存储一点中文数据:
    SQL> create table tcharset (name varchar2(40));SQL> insert into tcharset values('循序渐进深入浅出');-- 然后在客户端WE8ISO8859P1字符集下执行查询:
    D:\> set NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1D:\> sqlplus eygle/[email protected]@SZTYORA> select * from tcharset;NAME
    ----------------------------------------
    靠靠靠靠-- 现在我们看到8个汉字被转换成4个“靠”字输出显示?这是怎么回事呢?-- 我们知道,Oracle 数据库服务器是传输代码给客户端的,数据本身不存在问题,编码会原样传输到客户段:
    SQL> select name, dump(name) from tcharset;NAME         DUMP(NAME)
    ------------ -------------------------------------------------------------------------------------------------------------
    靠靠靠靠     Typ=1 Len=24: 229,190,170,229,186,143,230,184,144,232,191,155,230,183,177,229,133,165,230,181,133,229,135,186-- 那么可以确认存在问题的只是中间发生的转换环节。由于WE8ISO8859P1是8位的单Byte编码方案,所以中文汉字编码在其中不存在对应关系,
    -- 也就是无法转换,此时WE8ISO8859P1字符集会使用一个替换字符来代替中文,这个替换字符是“ ”,也就是一个倒过来的“?”,不同字符集的替换字符,
    -- 我们可以通过Locale Builder工具打开字符文件查看,如图3-12所示。......-- 注意这个特殊字符的编码为BF,那么也就是说,如果无法转换ZHS16GBK的8个中文字,WE8ISO8859P1将使用8个“ ”来替换,也就是说经过替换之后,
    -- 我们有了8个BF的编码,那么我们再来看看8个BF在客户端的GBK字符集里代表了什么:-- 通过微软网站上的936代码页我们可以找到如图3-13所示的图表。......-- 提示
    -- 936代码页的网址链接为 http://www.microsoft.com/globaldev/reference/dbcs/936.htm 。-- 从图3-13中可以看到,其中BFBF正好代表汉字“靠”,于是8个BF最后展现出来就变成了4个“靠”字。
    -- 也就可以通过ZHS16GBK字符集文件来找到这个编码,再者是一致的,如图3-14所示。......-- 这也就是不同字符集、应用之间转换导致的字符集问题。
      

  2.   

    我已经把客户端的NLS_LANG设置成和服务器一样了,都是AMERICAN_AMERICA.WE8ISO8859P1,可是还是写入数据库的时候中文的地方是乱码靠,英文的地方没问题
      

  3.   

    将服务器的字符集修改为 AMERICAN_AMERICA.AL32UTF8
    我们生产环境都是使用这个字符集,中英文,阿拉伯文都没有问题
      

  4.   

    服务器的字符集不能改我想问下AMERICAN_AMERICA.WE8ISO8859P1能存储中文吗?还是能显示中文?我在客户端用SQL语句之行也没错,可是用客户端的程序执行入库就有错,这是怎么回事呢?难道和VS2008的编程环境有关??
      

  5.   

    不太明白,看看这个对你有用没!!
    大概的原理是,当输入一个汉字时,客户程序得到这个汉字的汉字编码,16bit的,但是它不把它当16位的处理,当成两个八位的,然后把它分别存入数据库,取的时候也是按8bit取,当取道两个8bit的码值合起来是一个汉字的码值时,系统显示的是汉字,但是也有你的程序取了一半的汉字显示就是乱码的时候
    其实按这种原理,数据库和客户端是同种8位字符集与都是同种16位字符集,数据库中存储的码值其实是一样的