2017-09-14 58 views
0

我有這個表MySQL的比賽反對0結果在MyISAM中,但工作在InnoDB的

 
CREATE TABLE `tbl` (
    `id` bigint(20) NOT NULL, 
    `code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
ALTER TABLE `tbl` ADD PRIMARY KEY (`id`); 
ALTER TABLE `tbl` ADD FULLTEXT KEY `code` (`code`); 

INSERT INTO `tbl` (`id`, `code`) VALUES (1, '110.103'); 

,這是我的查詢

SELECT code FROM `tbl` WHERE (MATCH (code) AGAINST ('110.103*' IN BOOLEAN MODE)) 

但目前還沒有結果。 有什麼想法?

+0

你的桌子上有全文索引嗎? –

+0

@TimBiegeleisen是的,我有一個全文索引的代碼 – butching

+0

我試圖將其轉換爲InnoDB,我有一個結果 – butching

回答

1

首先,一個全文索引存儲的話。詞彙是分離的,例如一段時間 - 實際上任何不是字母,數字,下劃線或單撇號的東西。所以你的文本目前由兩個單詞「101」和「103」組成。

MySQL全文索引將只存儲文字a minimum word length。 MyISAM使用4作爲ft_min_word_len的默認值,因此您的3位數字「字」不包含在內,而InnodB使用3作爲innodb_ft_min_token_size,這就是它們包含的原因。更改這些設置(並重建您的索引),並且兩個引擎都會找到相同的行。

那麼說:MATCH (code) AGAINST ('110.103*' IN BOOLEAN MODE)仍然會搜索單詞。它將找到包含「單詞」110的任何行或(!)以103開頭的單詞。您可以強制執行這兩個詞,但是它們可以按任意順序排列。如果您使用against('"110 103"'),則可以執行特定的訂單,但"不再支持*了。

一個常見的技巧是用下劃線110_103(並以此方式搜索)存儲您的號碼,然後這是一個完整的單詞。你可以例如通過添加一個code_search - 通過使用觸發器保持最新的列(或將其定義爲生成的列)並在該列中進行搜索來實現。如果你的代碼也可以包含_,它不再區分_.,所以你必須添加一個附加條件(... where match (code_search) against (...) and code like '...')或類似的東西)。

但我不確定是否真的需要全文搜索。如果您的專欄實際上只包含一個代碼(而不是包含多個單獨文字的文本(這是全文索引的用例)),則可能需要嘗試where code like '101.103%',where code like '%101.103%'where code like '101.103%' or code like '% 101.103%',具體取決於您準確查找的內容。爲此,爲code添加一個(正常)索引,並且至少第一個搜索將比全文搜索更快(除了與全文搜索相比,它會爲您提供所需結果)。儘管我懷疑它是這種情況:如果您實際上正在尋找浮點數,那麼如果您可以將它們作爲實際數字存儲在單獨的列(或單獨的表if該數據每行包含多個浮點數)。

0

嘗試:'「110.103」*' 否則它會忽略「期間」。

+0

這個沒有結果 – butching

0

MySQL不允許的整數或雙精度值。對於全文搜索