1、该数据库是一个系统数据库,不能改任何东西,只能从里面读数据出来;
2、字符集是SQL_Latin1_General_CP1_CI_AS;
3、出现乱码的字段是char(25)
4、该字段内容只要是中文,select出来就是乱码,咋办?试着用COLLATE DATABASE_DEFAULT或者COLLATE Chinese_PRC_CI_AS也没用
2、字符集是SQL_Latin1_General_CP1_CI_AS;
3、出现乱码的字段是char(25)
4、该字段内容只要是中文,select出来就是乱码,咋办?试着用COLLATE DATABASE_DEFAULT或者COLLATE Chinese_PRC_CI_AS也没用
改NVARCHAR
另外数据库的记录不是我insert进去的,而是一个特殊的软件写记录的,我只有权利select出来。
-- 试试
select convert(nvarchar(30),convert(varbinary(30), col)) from tab
中文的就是形如:0xB9DCC0EDD4B120202020202020202020202020202020202020
英文的就是形如:0x61646D696E2020202020202020202020202020202020202020
也就是说,第一个字节:中文就是大于9也就是ABCDEF之类的,英文的就是0-9英文的记录必须用char或者varchar才行,不能convert成nvarchar
中文依旧是乱码,烦啊.....
实际内容为admin
16进制编码就是:61 64 6D 69 6E
就是上面我贴的:0x61646D696E2020202020202020202020202020202020202020
我的中文字段内容是:管理员
用这个软件查ascii码,就是B9:DC C0:ED D4:B1
现在我知道其实字段就是按照ascii存的,不管中文还是英文,只是中文按两个字节,英文按一个字节
可是为啥sqlserver就是convert不出来呢?????
不是不相信你。我前面说的很清楚了,这个数据库是一个特殊的行业软件自动生成的(这个行业软件打开的时候才能在sql的管理器里面看到这个数据库,你说特殊不特殊),不能更改里面的结构(我曾经试着改了字段为nvarchar就导致那个行业软件报错了)
我只能从里面读记录出来。
可以的。
我如果把字段改为nvarchar,这个行业软件反而就显示乱码了。
-- 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
/*管理员*/
那台运行行业软件的电脑上装个SQL Analyzer,然後再上面select,应该就行了。
既然这样,那就在读的时候指定排序规则,convert不是用来转换这个的
我最近也有类似的问题,数据库用的非Unicode,我的MFC用的Unicode,读出来就乱码