今天我們來(lái)談?wù)勅绾卧赑HP MySQL查詢(xún)中文。把中文存入MySQL是很常見(jiàn)的操作,但是有很多開(kāi)發(fā)者在從MySQL中讀取中文時(shí)卻遇到了一些錯(cuò)誤。這篇文章將會(huì)幫助你解決這些問(wèn)題。
首先我們需要確保MySQL中的字符編碼和PHP使用的字符編碼一致。我們可以在MySQL中使用如下命令查看字符編碼:
SHOW VARIABLES LIKE 'character_set%';
接下來(lái)在PHP連接MySQL時(shí)需要設(shè)置字符編碼,可以在連接時(shí)添加如下參數(shù):
$db_conn = mysqli_connect($host, $username, $password, $dbname); mysqli_set_charset($db_conn, 'utf8mb4');
這樣我們就可以保證MySQL與PHP使用的字符編碼一致了。
接下來(lái)我們需要確保使用正確的函數(shù)將中文從MySQL中讀取出來(lái)。當(dāng)我們使用mysqli_fetch_assoc方法從MySQL中獲取一條記錄時(shí),這個(gè)記錄中的字段值是以UTF-8編碼的字符串返回的。如果我們要使用這個(gè)字符串作為HTML輸出,需要使用htmlspecialchars函數(shù)來(lái)轉(zhuǎn)義。
$data = mysqli_fetch_assoc($result); echo htmlspecialchars($data['field_name']);
如果我們想要直接輸出中文,可以使用如下函數(shù):
$data = mysqli_fetch_assoc($result); echo mb_convert_encoding($data['field_name'], 'HTML-ENTITIES', 'UTF-8');
如果我們?cè)贛ySQL中存儲(chǔ)的是GB2312編碼的漢字,可以使用如下函數(shù)進(jìn)行轉(zhuǎn)換:
$data = mysqli_fetch_assoc($result); echo mb_convert_encoding($data['field_name'], 'UTF-8', 'GB2312');
有時(shí)候,我們需要檢索包含中文的數(shù)據(jù)。如果我們使用的是LIKE關(guān)鍵字來(lái)進(jìn)行檢索,會(huì)發(fā)現(xiàn)并不能查到包含中文的數(shù)據(jù)。這是因?yàn)槟J(rèn)情況下MySQL會(huì)將中文當(dāng)作二進(jìn)制數(shù)據(jù)來(lái)處理,而不是UTF-8編碼的字符串。
解決這個(gè)問(wèn)題的方法是將檢索列的字符集設(shè)置為utf8mb4_general_ci。可以使用如下命令修改已有的表:
ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
如果我們使用的是預(yù)處理語(yǔ)句,可以在執(zhí)行查詢(xún)之前設(shè)置字符集:
$stmt = mysqli_prepare($db_conn, "SELECT * FROM table_name WHERE column_name = ?"); mysqli_stmt_bind_param($stmt, "s", $param); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $result); mysqli_stmt_store_result($stmt); mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt);
最后,我們需要確保我們的PHP文件本身也是以UTF-8編碼保存的。如果在PHP文件中直接輸出中文而未設(shè)置文件編碼,可能會(huì)出現(xiàn)亂碼問(wèn)題。使用如下代碼來(lái)設(shè)置文件編碼:
header('Content-Type:text/html;charset=utf-8');
以上就是在PHP MySQL查詢(xún)中文時(shí)所需注意的問(wèn)題,如有不當(dāng)之處請(qǐng)指正。