sql 空格变问号;sql 无法 去掉 空格 ;sql rtrim 失效;(转载)

 

来源:https://www.cnblogs.com/lcawen/p/9473226.html

最近做系统,从邮件中导出邮件,上传到系统中,遇到一个奇葩的问题,如下:

通过本地文件看,文件名中是一个空格,上传至数据库后,展示就变成了问号,究其原因,发现是一个特殊字符导致:

    最近认真去查了一下这个问题,发现问题的关键,是编码方式:如果使用的Encoding是UTF-8的话,就会发生这种情况。
    问题的根源,在于UTF-8这种编码里面,存在一个特殊的字符,其编码是“0xC2 0xA0”,转换成字符的时候,表现为一个空格,跟一般的半角空格(ASCII 0x20)一样,唯一的不同是它的宽度不会被压缩,因此比较多的被用于网页排版(如首行缩进之类)。而其他的编码方式如GB2312、Unicode之类并没有这样的字符,因此如果简单地进行编码转换,生成地GB2312/Unocode字符串中,这个字符就会被替换成为问号(ASCII ox3F)。此时如果进行写库、写文件之类,就会把问号直接写入了。当然此时会有一种山寨方式:直接替换问号为空格。可是这种方法,会把原本真正的问号也枪毙掉。
    使用UTF-8进行HTMLDecode的时候,对于语句开头的( ),就会被自动转换成为这个特殊的空格,可能是判断为放在开头的空格,一定是用来排版的。在转换为其他编码之前,这个特殊的空格受到的待遇与普通的半角空格是一致的,甚至也会被trim()去掉。
    因此,碰到这个问题的原因有两种:一种是在UTF-8编码下进行了转换,产生了这个字符;还有一种就是网页中直接采用了这个字符进行排版。

解决方法如下:

byte[] space = new byte[] { 0xc2, 0xa0 };
string UTFSpace = Encoding.GetEncoding("UTF-8").GetString(space);
//替换为字符串空格
path.Replace(UTFSpace," ");
//替换为网页空格
path.Replace(UTFSpace," ");

 

常规方法尝试失败:

select ltrim(' test ') --去除左边的空格
select rtrim(' test ') --去除右边的空格
select rtrim(ltrim('Carica papaya '))   
select rtrim(ltrim(replace('Carica papaya ',' ',' ')))

update T_Plants2 set LatinSpecies= rtrim(ltrim(replace(LatinSpecies,' ',' '))) where Species='番木瓜'

我把'Carica papaya '复制出来测试,替换成功,但是 update 使用字段名称后替换失败。
可能原因:复制出来后编码已经发生改变。
 
posted @ 2020-07-03 19:06  hao_1234_1234  阅读(60)  评论(0编辑  收藏