1、该数据库是一个系统数据库,不能改任何东西,只能从里面读数据出来;
2、字符集是SQL_Latin1_General_CP1_CI_AS;
3、出现乱码的字段是char(25)
4、该字段内容只要是中文,select出来就是乱码,咋办?试着用COLLATE DATABASE_DEFAULT或者COLLATE Chinese_PRC_CI_AS也没用

解决方案 »

  1.   

    你需要把字段类型改为nvarchar(你需要的长度)插入数据时写:insert into tb (col) values(N'中文内容')
      

  2.   

    字段用NVARCHAR,插入时加N'',排序规则可别弄乱了
      

  3.   

    3、出现乱码的字段是char(25) 
    改NVARCHAR
      

  4.   

    我已经说了,这个数据库不能改任何东西。
    另外数据库的记录不是我insert进去的,而是一个特殊的软件写记录的,我只有权利select出来。
      

  5.   


    -- 试试
    select convert(nvarchar(30),convert(varbinary(30), col)) from tab
      

  6.   

    关键的是不知道软件 insert 数据时使用的格式,是否经过加密,等等。只能告诉 lz,将 char(25) 转换为 varbinary(25) 类型,然后自己分析一下编码形式。中文是双字节的,可以将 varbinary 中各个相邻的两个字节抽出来,转换为 char(2) 或 nvarchar(2) 类型,再看看。基本方法就是这样,lz 可以试试。
      

  7.   

    我认为存的时候SQL没正确识别出来,已经是乱码了只能更改该字段的字符集,但是你要知道程序中用的什么字符集
      

  8.   

    我convert成varbinary,发现一个规律:
    中文的就是形如:0xB9DCC0EDD4B120202020202020202020202020202020202020
    英文的就是形如:0x61646D696E2020202020202020202020202020202020202020
    也就是说,第一个字节:中文就是大于9也就是ABCDEF之类的,英文的就是0-9英文的记录必须用char或者varchar才行,不能convert成nvarchar
    中文依旧是乱码,烦啊.....
      

  9.   

    又发现英文的编码其实就是ascii码:
    实际内容为admin
    16进制编码就是:61 64 6D 69 6E
    就是上面我贴的:0x61646D696E2020202020202020202020202020202020202020
      

  10.   

    又有进步了,我下了一个中英文字符编码查询软件
    我的中文字段内容是:管理员
    用这个软件查ascii码,就是B9:DC C0:ED D4:B1 
    现在我知道其实字段就是按照ascii存的,不管中文还是英文,只是中文按两个字节,英文按一个字节
    可是为啥sqlserver就是convert不出来呢?????
      

  11.   


    不是不相信你。我前面说的很清楚了,这个数据库是一个特殊的行业软件自动生成的(这个行业软件打开的时候才能在sql的管理器里面看到这个数据库,你说特殊不特殊),不能更改里面的结构(我曾经试着改了字段为nvarchar就导致那个行业软件报错了)
    我只能从里面读记录出来。
      

  12.   


    可以的。
    我如果把字段改为nvarchar,这个行业软件反而就显示乱码了。
      

  13.   

    小人物说几句。如果 lz 确实需要用 select 读取,可以在其他排序规则为 Chinese_PRC_CI_AS 数据库下操作-- db_en 数据库的排序规则为 SQL_Latin1_General_CP1_CI_AS
    -- db_cn 数据库的排序规则为 Chinese_PRC_CI_AS 
    use [db_en]
    go
    create table tab (c varchar(30));
    insert into tab select 0xB9DCC0EDD4B1; -- “管理员”的 ascii 编码use [db_cn]
    go
    select convert(varchar(30),convert(varbinary(30),c)) from [db_en]..tab 
    /*管理员*/
      

  14.   


    那台运行行业软件的电脑上装个SQL Analyzer,然後再上面select,应该就行了。
      

  15.   


    既然这样,那就在读的时候指定排序规则,convert不是用来转换这个的
      

  16.   

    那个程序用的是多字节字符集?除了改变程序使用的编码,真想不到什么好方法。
    我最近也有类似的问题,数据库用的非Unicode,我的MFC用的Unicode,读出来就乱码