2010-04-27 95 views
3

突然想到有一個例子酒店表:Mysql的德國口音不敏感的搜索搜索

CREATE TABLE `hotels` (
    `HotelNo` varchar(4) character set latin1 NOT NULL default '0000', 
    `Hotel` varchar(80) character set latin1 NOT NULL default '', 
    `City` varchar(100) character set latin1 default NULL, 
    `CityFR` varchar(100) character set latin1 default NULL, 
    `Region` varchar(50) character set latin1 default NULL, 
    `RegionFR` varchar(100) character set latin1 default NULL, 
    `Country` varchar(50) character set latin1 default NULL, 
    `CountryFR` varchar(50) character set latin1 default NULL, 
    `HotelText` text character set latin1, 
    `HotelTextFR` text character set latin1, 
    `tagsforsearch` text character set latin1, 
    `tagsforsearchFR` text character set latin1, 
    PRIMARY KEY (`HotelNo`), 
    FULLTEXT KEY `fulltextHotelSearch` (`HotelNo`,`Hotel`,`City`,`CityFR`,`Region`,`RegionFR`,`Country`,`CountryFR`,`HotelText`,`HotelTextFR`,`tagsforsearch`,`tagsforsearchFR`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; 

在該表中,例如,我們只有一個酒店,域名=「格勞賓登州」(請注意元音ü字符)

,現在我想達到同樣的搜索匹配短語: 「格勞賓登」和 「格勞賓登州」

這是使用MySQL的內置 排序規則簡單在常規搜索如下:

SELECT * 
FROM `hotels` 
WHERE `Region` LIKE CONVERT(_utf8 '%graubunden%' USING latin1) 
COLLATE latin1_german1_ci 

這工作得很好「格勞賓登」和「格勞賓登州」和 ,結果我得到正確的結果,但問題是 當我們使MySQL全文搜索

請告訴我這條SQL語句錯了嗎?:

SELECT 
* 
FROM 
hotels 
WHERE 
MATCH (`HotelNo`,`Hotel`,`Address`,`City`,`CityFR`,`Region`,`RegionFR`,`Country`,`CountryFR`, `HotelText`, `HotelTextFR`, `tagsforsearch`, `tagsforsearchFR`) 
AGAINST(CONVERT('+graubunden' USING latin1) COLLATE latin1_german1_ci IN BOOLEAN MODE)    
ORDER BY Country ASC, Region ASC, City ASC 

這不會返回任何結果。 狗被埋葬的任何想法?

回答

3

當您爲您的列定義單個CHARACTER SETS時,將覆蓋您在表級別上設置的默認排序規則。

每個列都有默認的latin1排序規則(即latin1_swedish_ci)。您可以通過運行SHOW CREATE TABLE來查看它。

FULLTEXT查詢中,索引列有COERCIBILITY0,即所有全文查詢都轉換爲索引中使用的歸類,反之亦然。

您需要從列中刪除CHARACTER SET定義或明確設置的所有列latin1_german_ci

CREATE TABLE `hotels` (
    `HotelNo` varchar(4) NOT NULL default '0000', 
    `Hotel` varchar(80) NOT NULL default '', 
    `City` varchar(100) default NULL, 
    `CityFR` varchar(100) default NULL, 
    `Region` varchar(50) default NULL, 
    `RegionFR` varchar(100) default NULL, 
    `Country` varchar(50) default NULL, 
    `CountryFR` varchar(50) default NULL, 
    `HotelText` text, 
    `HotelTextFR` text, 
    `tagsforsearch` text, 
    `tagsforsearchFR` text, 
    PRIMARY KEY (`HotelNo`), 
    FULLTEXT KEY `fulltextHotelSearch` (`HotelNo`,`Hotel`,`City`,`CityFR`,`Region`,`RegionFR`,`Country`,`CountryFR`,`HotelText`,`HotelTextFR`,`tagsforsearch`,`tagsforsearchFR`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci; 

INSERT 
INTO hotels (hotelText, HotelTextFR, tagsforsearch, tagsforsearchFR) 
VALUES ('text', 'text', 'graubünden', 'tags'); 

SELECT * 
FROM hotels 
WHERE MATCH (`HotelNo`,`Hotel`,`City`,`CityFR`,`Region`,`RegionFR`,`Country`,`CountryFR`, `HotelText`, `HotelTextFR`, `tagsforsearch`, `tagsforsearchFR`) 
AGAINST (CONVERT('+graubunden' USING latin1) COLLATE latin1_german1_ci IN BOOLEAN MODE) 
ORDER BY 
     Country ASC, Region ASC, City ASC; 
+0

是100%真實。非常感謝你! – denesis 2010-04-27 14:53:29