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
.
Ils sont insensibles à la casse, sauf si vous faites une comparaison binaire .
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
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
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
).
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 |
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.
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.
Le classement que vous choisissez détermine si vous êtes sensible à la casse ou non.
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.
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
Essayez avec:
order by lower(column_name) asc;
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
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;
Vous pouvez l'essayer… .. espérons que cela vous sera utile.
SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "DickSavagewood"