1. 程式人生 > 實用技巧 >sql 空格變問號;sql 無法 去掉 空格 ;sql rtrim 失效;(轉載)

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('Caricapapaya'))

select rtrim(ltrim(replace('Caricapapaya','',' ')))

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

我把'Caricapapaya'複製出來測試,替換成功,但是 update 使用欄位名稱後替換失敗。 可能原因:複製出來後編碼已經發生改變。