16/08/2014 - MYSQL
Her ne kadar veritabanında veri olsa bile, IN BOOLEAN MODE
kullanılarak uzunluğu 4 karakterden az olan kelimeler için yapılan MySQL full-text aramalar, herhangi bir sonuç vermezler, bunun nedeni ise aramanın ft_min_word_len
ile tanımlanan "en az 4 karakter" kuralına takılmasıdır. Bu limiti delmek için aşağıdaki adımları takip edin.
# Tablo yarat.
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `index2` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
# Tabloyu doldur.
INSERT INTO `person` (`name`) VALUES ('abc');
Varsayılan olarak, değişken ft_min_word_len
'e değer olarak 4 atanmıştır, bu nedenle "abc" kelimesini sorgulamak sonuç vermeyecektir.
inanzzz@ubuntu:~$ mysql -u root -p
Enter password:
# Variable 'ft_min_word_len'.
mysql> SHOW VARIABLES LIKE 'ft_min_word_len';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| ft_min_word_len | 4 |
+-----------------+-------+
1 row in set (0.00 sec)
# Örnek sorgu.
mysql> SELECT *
-> FROM person
-> WHERE
-> MATCH(`name`) AGAINST ('abc' IN BOOLEAN MODE);
Empty set (0.00 sec)
Komut SET GLOBAL ft_min_word_len = 3;
'ün direkt olarak kullanımı, "#1238 - Variable 'ft_min_word_len' is a read only variable" hatası verir, o nedenle MySQL konfigürasyonunu manuel olarak ayarlayın.
inanzzz@ubuntu:~$ sudo gedit /etc/mysql/my.cnf
# Anahtar ve değer bileşenleri [mysqld] bloğuna ekleyin:
[mysqld]
ft_min_word_len = 3
inanzzz@ubuntu:~$ sudo service mysql restart
mysql stop/waiting
mysql start/running, process 3797
Komut
REPAIR
, InnoDB depolama motoru için kullanılamaz, aksi takdirde "The storage engine for the table doesn't support repair" hatası oluşur. InnoDB'yi MyISAM olarak değiştirmek için ALTER TABLE
ENGINE=MyISAM; komutu kullanılır.
mysql> REPAIR TABLE person QUICK;
+----------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------+--------+----------+----------+
| inanzzz.person | repair | status | OK |
+----------------+--------+----------+----------+
1 row in set (0.00 sec)
Tekrar sorgulama
mysql> SELECT *
-> FROM person
-> WHERE
-> MATCH(`name`) AGAINST ('abc' IN BOOLEAN MODE);
+----+------+
| id | name |
+----+------+
| 1 | abc |
+----+------+
1 row in set (0.00 sec)