[MySQL][PHP][跳脫字元] – 當 MySQL LIKE %% 碰到特殊字元

BIG5的環境下,
特殊字元(許蓋功)模糊比對進行搜尋時,
會發生找不到指定字的問題,
那要如何解決呢?
以下就舉個例子…
問題: 在碰到『珮』等特殊用元時,下面的語法是無法正確比較出結果

QUERY =>
SELECT
*
FROM `ecstart_smartit_list`
WHERE 1 AND `custodian`
LIKE ‘%珮\%’
LIMIT 0 , 30

RESULT=>
NULL
方法一:Regular Expression (以下簡稱 REGEX)

SELECT  *
FROM  `ecstart_smartit_list`
WHERE 1  AND  `custodian`
REGEXP  ‘珮\\\’

RESULT=>
pcname                 ip                   mac                      organization               custodian
100-36020009     192.27.1.35   00142a70494c     董事長室\ 董事長室     詹小珮
100-36021855     192.20.2.33   0018716f3362      董事長室\ 董事長室     陳珮如
100-36021863     0.0.0.0           0013026f61ce      董事長室\ 董事長室     江珮珴

方法二:建議

SELECT  *
FROM  `ecstart_smartit_list`
WHERE 1  AND  `custodian`
LIKE BINARY  ‘%珮\\\%’

原理

The BINARY operator casts the string following it to a binary string. This is an easy way to force a column comparison to be done byte by byte rather than character by character. This causes the comparison to be case sensitive even if the column isn’t defined as BINARY or BLOB. BINARY also causes trailing spaces to be significant.

mysql> SELECT 'a' = 'A';
        -> 1
mysql> SELECT BINARY 'a' = 'A';
        -> 0
mysql> SELECT 'a' = 'a ';
        -> 1
mysql> SELECT BINARY 'a' = 'a ';
        -> 0

Filed under MySQL, PHP · Tagged with

Comments

4 Responses to “[MySQL][PHP][跳脫字元] – 當 MySQL LIKE %% 碰到特殊字元”
  1. 夕口 says:

    ECMAScript/JavaScript 的 REGEX 規則是以 Perl 的規則為範本 (PHP 中稱為 PCRE 的內容) ,本文僅簡短說明幾個常見的字元意義。想了解更多用法者,請參看 Perl/PHP 的相關書籍,以及 ECMA-262 15.10 的內容。

    1. ^
    寫在 pattern 第一個位置時,表示其後一符號必須出現在字串開頭的位置。寫在 pattern 中間位置時則為否定之意,表示字串中不可有 ^ 之後一符號的內容。
    2. $
    寫在 pattern 最後一個位置時,表示其前一符號必須出現在字串尾端的位置。寫在 pattern 中時無特別意義。
    3. *
    表示字串中有 0 到無數個其前一符號的內容。
    4. +
    表示字串中有 1 到無數個其前一符號的內容。
    5. ?
    表示字串中有 0 到 1個其前一符號的內容。
    6. { }
    表示前一符號在字串中的重覆次數。例如 /A{2}/ 表示 ‘A’ 重覆兩次 (即 ‘AA’) ;/A{2,}/ 表示字串含有 2 到無數多個 ‘A’ ;/A{2,5}/ 表示含有 2 到 5 個 ‘A’ 。
    7. .
    表示一個任意字元。
    8. [ ]
    表示字串含有括號中任一字元的內容。可以 – 表示一組連續字元,例如 /[a-z]/, /[0-9]/ 。注意, [] 僅代表一個字元,例如 /[abc]/ 表示 ‘a’ 或 ‘b’ 或 ‘c’ ,而不是 ‘abc’ 。
    9. ( )
    表示一個 sub pattern ,符合 sub pattern 的字串內容會被存放在匹配陣列中,並依序指派數字代表此 sub pattern 。可以此數字在 pattern 的其他地方引用內容,例如 /The h([0-9]) means Title (\1)/ 表示第 1 個 sub pattern 是 0 到 9 的任一字元,而 \1 表示匹配的內容。故 ‘The h1 means Title 1′, ‘The h2 means Title 2′ 到 ‘The h9 means Title 9′ 符合規則。
    10. \
    表示轉義 (escaping) ,將其後的字元視為一般字元。例如要表示字串中含有 ‘/’ 字元時,就必須寫作 /\// 。
    11. |
    「或」意,字串中含有 ‘|’ 之前一符號或後一符號的內容。例如 /image\.(jpg|png)/ 表示 ‘image.jpg’ 或 ‘image.png’ 。通常會用 () 括住 ‘|’ 的前後符號。
    12. \d
    表示任何一個數字,意同 [0-9] 。
    13. \D
    表示任何一個非數字,意同 [^0-9] 。
    14. \w
    表示任何一個字元與數字以及 ‘_’ ,意同 [a-zA-Z0-9_] 。
    15. \W
    表示任何一個 \w 以外的字元。
    16. \s
    表示任何一個空白符號,包括 \t, \v 等。
    17. \S
    表示任何一個非空白符號。

Trackbacks

Check out what others are saying about this post...
  1. [...] 引入至夕口技術錄 Category: 程式進修 You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. Leave a Reply [...]

  2. [...] 引入至夕口技術錄 Category: 程式進修 You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. Leave a Reply [...]

  3. [...] 引入至夕口技術錄 Category: 程式進修 You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site. Leave a Reply [...]



Speak Your Mind

Tell us what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!