2010-05-20 6 views
0

J'ai des problèmes avec la sensibilité à la casse dans MySQL FULLTEXT recherches.MySQL FULLTEXT aggravation

Je viens de suivre l'exemple FULLTEXT dans le doco MySQL au http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html. Je vais poster ici pour plus de commodité ...

CREATE TABLE articles (
id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, 
title VARCHAR(200), 
body TEXT, 
FULLTEXT (title,body) 
); 

INSERT INTO articles (title,body) VALUES 
('MySQL Tutorial','DBMS stands for DataBase ...'), 
('How To Use MySQL Well','After you went through a ...'), 
('Optimizing MySQL','In this tutorial we will show ...'), 
('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), 
('MySQL vs. YourSQL','In the following database comparison ...'), 
('MySQL Security','When configured properly, MySQL ...'); 

SELECT * FROM articles 
WHERE MATCH (title,body) 
AGAINST ('database' IN NATURAL LANGUAGE MODE); 

... mon problème est que l'exemple montre que SELECT retourner les première et cinquième lignes (« ..DataBase .. » et ' ..database .. ') mais je n'ai qu'une ligne (' database ')!

L'exemple ne montre pas le classement de la table dans l'exemple mais je me suis retrouvé avec latin1_general_cs sur les colonnes title et body de ma table d'exemple.

Ma version de MySQL est 5.1.39-log et le classement de connexion est utf8_unicode_ci.

Je serais vraiment reconnaissant si quelqu'un pouvait suggérer pourquoi mon expérience diffère de l'exemple dans le manuel!

Soyez reconnaissant pour tout conseil.

Répondre

1

Je suppose que votre classement par défaut est sensible à la casse quelque part - vu que vous avez fini avec latin1_general_cs dans votre tableau. Peut-être au démarrage?

Vous pouvez vérifier à l'aide

show variables like 'collation%' 

Ce qui me donne:

+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | latin1_swedish_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | latin1_swedish_ci | 
+----------------------+-------------------+ 
3 rows in set (0.00 sec) 

Ainsi, l'exemple fonctionne comme annoncé sur mon serveur.

Le classement des colonnes de votre table sera par défaut la collation de la base de données, du serveur ou de la table, selon le cas. En d'autres termes, classement spécifié au niveau de la colonne Bloque toute au niveau de la table, qui remplace le niveau de base de données, etc.

collation de colonne est specified using this syntax:

col_name {CHAR | VARCHAR | TEXT} (col_length) 
    [CHARACTER SET charset_name] 
    [COLLATE collation_name] 

Voir §9.1 of the MySQL documentation pour les détails sordides.

+0

Très bien - merci beaucoup d'expliquer cela. J'ai maintenant recréé le tableau indiquant précisément le classement/jeu de caractères: créer des articles de table ( id INT UNSIGNED AUTO_INCREMENT NOT NULL clé primaire, titre VARCHAR (200), corps TEXTE, FULLTEXT (titre, corps) ) JEU DE CARACTÈRES PAR DÉFAUT latin1 COLLATE latin1_general_ci; ... et la requête fonctionne maintenant comme le suggère l'exemple. Merci beaucoup pour votre aide. – shearichard