web-dev-qa-db-fra.com

MySQL insensible à la casse, sélectionnez

Quelqu'un peut-il me dire si une commande SELECT de MySQL est insensible à la casse par défaut? Et si non, quelle commande devrais-je envoyer pour pouvoir faire quelque chose comme:

SELECT * FROM `table` WHERE `Value` = "DickSavagewood"

Où en réalité, la valeur réelle de Value est dicksavagewood.

204
NoodleOfDeath

Ils sont insensibles à la casse, sauf si vous faites une comparaison binaire .

437
Marc B

Vous pouvez mettre en minuscule la valeur et le paramètre passé:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("DickSavagewood")

Une autre (meilleure) méthode consisterait à utiliser l'opérateur COLLATE comme indiqué dans la documentation

102
Colin Hebert

UTILISER BINARY

C'est un simple choix

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

Ceci est une sélection avec binaire

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

ou

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0

48
Someone

Les comparaisons sont non sensibles à la casse} lorsque la colonne utilise un classement qui se termine par _ci (tel que le classement defaultlatin1_general_ci) et elles sont sensible à la casse lorsque la colonne utilise un classement se termine par _cs ou _bin (comme les classements utf8_unicode_cs et utf8_bin). 

Vérifier le classement

Vous pouvez vérifier vos classements server, database et connection en utilisant:

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

et vous pouvez vérifier votre classement table en utilisant:

mysql> SELECT table_schema, table_name, table_collation 
       FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

Changer de classement

Vous pouvez modifier le classement de votre base de données, table ou colonne en un élément sensible à la casse, comme suit:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

-- or change column collation
ALTER TABLE `table` CHANGE `Value` 
    `Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

Vos comparaisons devraient maintenant être sensibles à la casse.

27
ostrokach

La comparaison de chaîne dans la phrase WHERE n'est pas sensible à la casse. Vous pouvez essayer de comparer en utilisant

WHERE `colname` = 'keyword'

ou

WHERE `colname` = 'KeyWord'

et vous obtiendrez le même résultat. C'est le comportement par défaut de MySQL.

Si vous voulez que la comparaison soit sensible à case, vous pouvez ajouter COLLATE comme ceci:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'

Ce SQL donnerait un résultat différent avec celui-ci: WHERE colname COLLATE latin1_general_cs = 'mot-clé'

latin1_general_cs est un classement courant ou par défaut dans la plupart des bases de données.

25
Ifan Iqbal

Le classement que vous choisissez détermine si vous êtes sensible à la casse ou non.

16
chuck taylor

La valeur par défaut est sensible à la casse, mais La deuxième chose la plus importante. Vous devriez examiner la manière dont la table a été créée. Au début, vous pouvez spécifier la sensibilité à la casse lors de la création de la table. 

Le script ci-dessous crée une table. Remarquez au bas de la page, il est écrit "COLLATE latin1_general_cs". Cs à la fin signifie sensible à la casse. Si vous voulez que votre table Respecte la casse, vous pouvez laisser cette partie Ou utiliser "COLLATE latin1_general_ci".

   CREATE Table PEOPLE (

       USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,

       FIRST_NAME  VARCHAR(50) NOT NULL,
       LAST_NAME  VARCHAR(50) NOT NULL,

       PRIMARY KEY (USER_ID)

   )

   ENGINE=MyISAM DEFAULT CHARACTER SET latin1
    COLLATE latin1_general_cs AUTO_INCREMENT=0;

Si votre projet est tel que vous pouvez créer votre table Own, il est logique de spécifier votre préférence de sensibilité pour la casse lorsque vous créez la table. 

9
Ken Johnson

SQL Select n'est pas sensible à la casse.

Ce lien peut vous montrer comment faire est sensible à la casse: http://web.archive.org/web/20080811231016/http://sqlserver2000.databases.aspfaq.com:80/how-can-i-make- my-sql-queries-case-sensitive.html

4
Jacob Nelson

Essayez avec: 

order by lower(column_name) asc;
2
VS-java

Notez également que les noms de table sont sensibles à la casse sous Linux sauf si vous définissez la directive lower_case_table_name config sur 1. En effet, les tables sont représentées par des fichiers sensibles à la casse sous Linux. 

Méfiez-vous particulièrement des développements sur Windows qui ne sont pas sensibles à la casse et qui se déploient en production là où ils se trouvent. Par exemple:

"SELECT * from mytable" 

contre table, ma table réussira sous Windows mais échouera sous Linux, à moins que la directive susmentionnée ne soit définie.

Référence ici: http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

2
Wes Grant

Les champs de chaîne avec l'indicateur binaire seront toujours sensibles à la casse. Si vous avez besoin d'une recherche sensible à la casse pour un champ de texte non binaire, utilisez ceci: SELECT 'test' REGEXP BINARY 'TEST' AS RESULT;

0
user2288580

Vous pouvez l'essayer… .. espérons que cela vous sera utile.

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "DickSavagewood"
0
Zahid