zoukankan      html  css  js  c++  java
  • 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 使用字段名称后替换失败。
    可能原因:复制出来后编码已经发生改变。
     
  • 相关阅读:
    2016-12-31:最后一天:回顾
    ubuntu-15.10-server-i386.iso 安装 Oracle 11gR2 数据库
    ubuntu-15.04-server-i386.iso 安装 Oracle 11gR2 数据库
    ubuntu-16.04+-xxx-i386.iso :安装 Oracle 11gR2 数据库
    VirtualBox 所有版本的下载地址:http://download.virtualbox.org/virtualbox/
    上海医保每年注入时间
    打新股
    check system version
    add, subtract, multiply, divide
    WRITE T AFTER ADVANCING 2 LINES
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/13232281.html
Copyright © 2011-2022 走看看