因为已经改好了,测试没有实际示例,仅操作模拟说明:
某表中有一个字段如:
charTest(col Nvarchar(50))
表中某列有符号'【',但是在前端查询出来是时候出现很多这种乱码符号:
'?【', '??【', '???【'
将字段拷贝到studio来看,没发现有问题,前后都没有空格,都是正确的:
【hh】
【dd】
【ee】
【aa】
但是连续的拷贝到同一行时,发现前后出现空字符了:
【hh】 【hh】 【hh】
然后直接更新,去掉所有空格:
update dbo.charTestset col=LTRIM(RTRIM(charTest))
不行,在试:
update dbo.charTestset col=REPLACE(col,' ','')
还是不行,前面的符号一直去不掉。将中间的符号及其空格取出查看长度:
可以看到,SELECT LEN('')看起来没有长度,但是却存在4个长度!
在查询SELECT LEN(' 【')中,拷贝符号'【'前面的空字符。用ascii码查询,发现对应编码为63,再转换为字符,发现竟然是问号'?'!这就是在前端看到的乱码,也就是说空的字符中存在乱码,但是数据库中没看到!查看数据库编码和列的属性都是正常的!
尝试转换字符看一下,都显示出来了:
SELECT col,CONVERT(VARCHAR(100),col)FROM dbo.charTest
【hh】 ?【hh】
【dd】 ??【dd】
【ee】 ???【ee】
【aa】 ????【aa】
最终的解决办法:
先转换字符,再替换问号为空字符,更新回表中!
update dbo.charTestset col=REPLACE(CONVERT(VARCHAR(100),col),'?','')
这些再查看,已经不存在看不见的字符了!
SELECT col,CONVERT(VARCHAR(100),col)
FROM dbo.charTest
where col <>CONVERT(VARCHAR(100),col)
这里再给个具体示例:
-- drop table #test
create table #test(col nvarchar(10),coll varchar(10))
insert into #test(col,coll)
select 'AA▪BB','Q★Q'
union all
select N'AA▪BB',N'Q★Q'
select * from #test
可以看到,如果类型为的nvarchar,插入表时必须显式转换nvarchar类型,否则保存的就是乱码.
与上面的实际数据库例子中不同的是:这个示例可以看出转换的乱码