2012-02-14 48 views
0

我遇到了一個MySQL程序的麻煩。該過程本身的作品,但只有當我使用拉丁字符。如果我使用西里爾字符串,它不起作用。該表位於頁面頂部的utf8_general_ci,我有「SET NAMES'utf8'」。任何關於這篇文章的幫助表示讚賞。以下是我的代碼。MySQL程序。喜歡模式匹配 - 西里爾字符串

CREATE PROCEDURE `selUsers`(IN usrNme VARCHAR(25)) 
BEGIN 


SELECT * 
    FROM users WHERE 1 
     AND (user_real_name LIKE CONCAT('%', usrNme, '%') OR user_company LIKE CONCAT('%', usrNme, '%') OR user_name LIKE CONCAT('%', usrNme, '%')) 
    ORDER BY user_real_name ASC LIMIT 0, 15; 

    END 

回答

2

爲了使其工作,你打開的連接並選擇數據庫之後,你應該使用SET NAMES,來告訴MySQL客戶端將使用特定的字符集來發送數據。詳情請查看here。 針對您的特殊情況下,它應該是

SET NAMES utf8 

另外,我想改用utf8_general_ci的utf8_unicode_ci。確實,utf8_unicode_ci比utf8_general_ci慢,但你會得到更好的比較(更精確)... utf8_general_ci只適用於俄羅斯保加利亞語西里爾語的子集。在使用白俄羅斯馬其頓塞爾維亞,並烏克蘭多餘的字母不排序嗯......你應該有這個感覺,如果你會使用一些字母的那些字母cyrilic。

+0

感謝您的回覆。我很感激。我改變了程序,但在西里爾文搜索時沒有結果。以下是新代碼。 DELIMITER // CREATE PROCEDURE selUsers(IN usrNme VARCHAR(25)) BEGIN SET NAMES'utf8'; SELECT USER_ID,user_real_name,user_company,USER_NAME \t FROM用戶WHERE 1 AND(user_real_name LIKE CONCAT( '%',usrNme, '%')OR user_company LIKE CONCAT( '%',usrNme, '%')OR USER_NAME LIKE CONCAT('%',usrNme,'%')) \t ORDER BY user_real_name ASC LIMIT 0,15; END // DELIMITER; – 2012-02-15 15:02:08

+0

我不認爲問題出在你的程序中,而是你如何從你的代碼中調用它。打開連接後,執行SET NAMES utf8命令,然後檢查它是如何工作的。 – 2012-02-15 15:57:31

+0

在調用過程之前,我使用SET NAMES utf8,然後使用mysql_query(「CALL selUsers('」。$ que。「')」);謝謝。 – 2012-02-20 12:36:14