Mysql查詢去空格的多種方法匯總
目錄
- 一、背景
- 二、方法
- 1、trim()、ltrim()、rtrim()函數
- (1)trim()去除字段首尾空白字符,也可以去除指定字符
- (2)ltrim()去除左空格
- (3)rtrim()去除右空格
- 2、replace()函數
- (1)替換字段中指定字符為新字符
- (2)指定去除一下特殊字符
- 3、convert()函數配合trim()函數(解決了我的問題)
- 補充:你不知道的空格
- Level1: 半角空格
- Level2: 全角空格
- Level3: 不間斷空格 ( non-breaking space )
- Level4: 零寬度空格 (ZERO WIDTH SPACE)
- Level5: 其他空格字符空格
- 總結
一、背景
最近系統線上數據庫數據出現一個問題,發現某些字段存在一些異常的首尾空格,不管是使用trim對比還是like查詢都查詢不到具體的數據;在網上找了一些方法,最后發現一個去“不間斷空格”的方法解決了問題,在這里做一下記錄和匯總。
二、方法
1、trim()、ltrim()、rtrim()函數
語法:trim(字段) || trim([{BOTH | LEADING | TRAILING} [指定字符] FROM] 字段)
(1)trim()去除字段首尾空白字符,也可以去除指定字符
列子:去除商品零件號左右空格,以及指定字符,打印去除字符后的長度
select p.parts_num as "零件號(包含首尾各3個空格)", length(p.parts_num) as "原始長度", trim(p.parts_num), length(trim(p.parts_num)) as "去除左右空格后長度", trim(leading " 7" from p.parts_num), length(trim(leading " 7" from p.parts_num)) as "去除左邊字符后長度", trim(trailing "7 " from p.parts_num), length(trim(trailing "7 " from p.parts_num)) as "去除右邊字符后長度"from product pwhere p.product_id = "1941573845271945216";
結果:
(2)ltrim()去除左空格
select p.parts_num as "零件號(包含首尾各3個空格)", length(p.parts_num) as "原始長度", ltrim(p.parts_num), length(ltrim(p.parts_num)) as "去除左空格后長度"from product pwhere p.product_id = "1941573845271945216";
結果:
(3)rtrim()去除右空格
select p.parts_num as "零件號(包含首尾各3個空格)", length(p.parts_num) as "原始長度", rtrim(p.parts_num), length(rtrim(p.parts_num)) as "去除右空格后長度"from product pwhere p.product_id = "1941573845271945216";
結果:
2、replace()函數
語法:replace(object,search,replace)
(1)替換字段中指定字符為新字符
select p.parts_num as "零件號(包含首尾各3個空格)", length(p.parts_num) as "原始長度", replace(p.parts_num, " ", ""), length(replace(p.parts_num, " ", "")) as "替換空格后長度", replace(p.parts_num, "7", "8") as "把7替換成8"from product pwhere p.product_id = "1941573845271945216";
結果:
(2)指定去除一下特殊字符
水平制表符:CHAR(9)、換行符:CHAR(10)、回車符:CHAR(13)
REPLACE(REPLACE(REPLACE(p.parts_num, CHAR(9), ""), CHAR(10), ""), CHAR(13), "")
3、convert()函數配合trim()函數(解決了我的問題)
(1)使用convert()先轉換一些特殊編碼的空格(unicode碼位u+00a0的utf-8編碼,也稱為不間斷空格)轉換成常規空格(ASCII 中編碼為0x20)
-- convert轉換,trim去除select TRIM(convert(0xC2A0 using utf8mb4) FROM p.parts_num); -- 替換掉字符中的不間斷空格select TRIM(REPLACE(p.parts_num, convert(0xC2A0 using utf8mb4), " "));
這些特殊空格一般常見于各文本編輯器(word、Excel等,剛好出現問題的業務存在Excel導入數據的場景),想要詳細了解看下面推薦的文章。
補充:你不知道的空格
Level1: 半角空格
歷史最悠久的空格,在1967年,ASCII 規范中被定義。
空格在 ASCII 中編碼為0x20, 占位符為一個半角字符。在日常英文書寫和代碼編寫中使用。
Level2: 全角空格
中文輸入中的空格(標準說法為中日韓表意字符(CJK)中使用的寬空格)。和其他漢字一樣,作為GBK的一個字符,其對應的unicode碼為\u3000.寬
度是2個半角空格的大小。
例如:
先生 孫先生
Level3: 不間斷空格 ( non-breaking space )
unicode 為 \u00A0, 在代碼中可能會出現的編碼錯誤(utf8 編碼0xC2 0xA0) 就是它了。
在Word中,會遇到一個有多個單詞組成的詞組被分割在兩行文字中,這樣很容易讓人看不明白。這時候,不間斷空格就可以上場了。
輸入不間斷空格,會將不間斷空格連著的單詞在一行展示。
舉個例子:
上面英文使用了不間斷空格,下面沒有使用。所以上面的英文自動在一行展示,而下面沒有。
在word中輸入不間斷空格的方式為: (Ctrl + Shift + Space)
除了在word等文本編輯軟件中使用,其實不間斷空格在html 中大量使用。 是html 中最為常見的空格。由于html頁面中,如果有多個連著的半角空格,則空格只會展示一個。而使用 空格,則會顯示占位半個自寬。
Level4: 零寬度空格 (ZERO WIDTH SPACE)
零寬度空格有兩種
- 零寬度空格 unicode 編碼為 \u200B.
不可見非打印字符。有了半角空格,也有了全角空格,其實還有零寬度空格。因為寬度為零,因此該字符是一個不可見字符。
這個編碼雖然是不可見的,但是也是非常有用的。它可以替換html中的標簽(軟換行, html5 新增)。
- 零寬度非中斷空格(ZWNBSP) unicode 編碼為 \u2060 (之前使用\ufeff表示,unicode 3.2 開始 \ufeff 標記unicode文檔的字節序。)
該空格結合了 non-breaking space 和 零寬度空格的特點。既會自動換行,寬度又是0。
零寬度空格(軟換行)舉例:
一行連續的英文編碼:
<p>phpIsTheBestProgramingLanguageInTheWorld</p>
而如果在每個可以換行的地方加上 <wbr />, 則可以在標記的最近的地方換行。
<p>php<wbr />Is<wbr />The<wbr />Best<wbr />Programing<wbr />Language<wbr />In<wbr />The<wbr />World</p>
Level5: 其他空格字符空格
雖然已經有半角空格、全角空格,但是上面的空格如果字體變化了,不會隨著字體的變化而變化。
因此,又有了可以隨著字體的變化而變化的空格,簡單羅列如下:
在html 的寬度度量中,有一種單位叫em,是按照字體大小定義的,下面的em也是字體的寬度。
打印字符的空格有很多種,羅列幾個:
總結
到此這篇關于Mysql查詢去空格的文章就介紹到這了,更多相關Mysql查詢去空格內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
