MySQL 是一種常用的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),但在使用過程中,我們可能會(huì)遇到字符串不正確的問題。
例如,有時(shí)我們?cè)趫?zhí)行 SELECT 語句時(shí),會(huì)發(fā)現(xiàn)無法查詢到匹配的結(jié)果,原因是可能字符串不符合要求。
SELECT * FROM my_table WHERE name='John'
上面的語句看起來很簡(jiǎn)單,但如果我們的數(shù)據(jù)庫(kù)表中的 name 字段存儲(chǔ)的是 John 這個(gè)值的 UTF-8 編碼,那么就無法成功查詢。
此時(shí),我們應(yīng)該將查詢語句修改為以下形式:
SELECT * FROM my_table WHERE name=CONVERT('John' USING utf8)
這樣就可以在比較字符串時(shí),將編碼方式轉(zhuǎn)換為 utf8,確保能夠正確匹配。
除此之外,如果我們?cè)诔绦蛑惺謩?dòng)拼接 SQL 語句時(shí),也需要注意字符串的正確性。
// 假設(shè)用戶輸入了以下的敏感詞 $keyword = "'; DROP TABLE users; --"; // 拼接 SQL 語句 $sql = "SELECT * FROM my_table WHERE name='$keyword'";
上面的代碼中,我們沒有對(duì) $keyword 變量進(jìn)行任何的過濾處理,直接拼接到了 SQL 語句中,這會(huì)導(dǎo)致嚴(yán)重的 SQL 注入漏洞。
為了避免這種情況的出現(xiàn),應(yīng)該使用參數(shù)化查詢,將變量以參數(shù)的形式傳入 SQL 語句中。
// 假設(shè)用戶輸入了以下的敏感詞 $keyword = "'; DROP TABLE users; --"; // 使用參數(shù)化查詢 $stmt = $pdo->prepare('SELECT * FROM my_table WHERE name=?'); $stmt->execute([$keyword]);
這樣就能夠確保查詢的安全性,避免 SQL 注入的問題。