0
点赞
收藏
分享

微信扫一扫

Sql Server 表中看不见的乱码


因为已经改好了,测试没有实际示例,仅操作模拟说明:



 

某表中有一个字段如:

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,' ','')

 

还是不行,前面的符号一直去不掉。将中间的符号及其空格取出查看长度:


Sql Server 表中看不见的乱码_字段


可以看到,SELECT LEN('')看起来没有长度,但是却存在4个长度!

 


在查询SELECT LEN('   【')中,拷贝符号'【'前面的空字符。用ascii码查询,发现对应编码为63,再转换为字符,发现竟然是问号'?'!这就是在前端看到的乱码,也就是说空的字符中存在乱码,但是数据库中没看到!查看数据库编码和列的属性都是正常的!


Sql Server 表中看不见的乱码_显式转换_02



尝试转换字符看一下,都显示出来了:

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

Sql Server 表中看不见的乱码_显式转换_03



可以看到,如果类型为的nvarchar,插入表时必须显式转换nvarchar类型,否则保存的就是乱码.

与上面的实际数据库例子中不同的是:这个示例可以看出转换的乱码





举报

相关推荐

0 条评论