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 使用字段名称后替换失败。
可能原因:复制出来后编码已经发生改变。
汇总整理:https://www.cnblogs.com/hao-1234-1234/p/8489498.html
树立目标,保持活力,gogogo!