Les noms de table dans MySQL sont-ils sensibles à la casse?

173

Les noms de table dans MySQL sont-ils sensibles à la casse?

Sur ma machine de développement Windows, le code que j'ai est capable d'interroger mes tables qui semblent être toutes en minuscules. Lorsque je déploie sur le serveur de test de notre centre de données, les noms de table semblent commencer par une lettre majuscule.

Les serveurs que nous utilisons sont tous sur Ubuntu.

Benstpierre
la source

Réponses:

203

En général:

Les noms de base de données et de table ne sont pas sensibles à la casse sous Windows et à la casse dans la plupart des variétés d'Unix.

Dans MySQL, les bases de données correspondent aux répertoires dans le répertoire de données. Chaque table d'une base de données correspond à au moins un fichier dans le répertoire de la base de données. Par conséquent, la sensibilité à la casse du système d'exploitation sous-jacent joue un rôle dans la sensibilité à la casse des noms de base de données et de table.

On peut configurer la façon dont les noms de tables sont stockés sur le disque en utilisant la variable système lower_case_table_names(dans le fichier de configuration my.cnf sous [mysqld]).

Lisez la section: 10.2.2 Sensibilité à la casse des identificateurs pour plus d'informations.

NuageuxMarbre
la source
40
Cela m'a totalement brûlé car mon code fonctionnait très bien sur mon environnement Windows local, mais en lançant des exceptions lors du passage en production sur Linux !! Merci!
portforwardpodcast
6
Il y a une mise en garde à cette réponse, qui n'est pas mentionnée dans la documentation: InnoDB n'utilise pas de noms de fichiers ou de répertoires pour les bases de données et les tables, et donc ses objets sont toujours insensibles à la casse, même lorsqu'ils sont exécutés sur un système sensible à la casse. Voir cette question pour un exemple de ce qui peut mal tourner à cause de ceci: stackoverflow.com/questions/23182969/…
Jules
ce n'est pas toute l'histoire. voir la réponse de StephenLembert car elle est configurable
Chris Wood
1
Par défaut, la plupart des ordinateurs Mac utilisent un système de fichiers insensible à la casse. Vous pouvez cependant choisir de faire en sorte que votre système de fichiers soit sensible à la casse.
Chad
Ceci et la sensibilité à la casse des noms de fichiers sont l'une des raisons qui m'ont amené à passer à Ubuntu en tant que développeur Web.
Muhammad bin Yusrat
99

Les noms de base de données et de table ne sont pas sensibles à la casse sous Windows et à la casse dans la plupart des variétés d'Unix ou Linux.

pour résoudre le problème, définissez le paramètre lower_case_table_names sur 1

lower_case_table_names = 1

cela rendra tous vos tableaux en minuscules, peu importe comment vous les écrivez

StephenLembert
la source
1
Ils ne sont pas non plus sensibles à la casse sur MacOS X, même si l'Unix sous-jacent l'est. C'est probablement la raison pour laquelle la saisie semi-automatique dans MySQL sur Mac est sensible à la casse pour les noms de table ou de champ, même si les requêtes ne le sont pas.
David le
Oui, mais là pour mettre cette déclaration? Je suppose que c'est sur: /etc/mysql/my.cnf sous le groupe [mysql]. Mais cela ne suffit pas, il reste encore quelque chose à faire (à part bien sûr redémarrer mysql ...
Alg_D
1
Cela n'affecte que les nouvelles tables. Les tables existantes doivent être renommées en minuscules avant de modifier ce paramètre.
Martin
19

Les noms de table dans MySQL sont des entrées de système de fichiers, ils ne sont donc pas sensibles à la casse si le système de fichiers sous-jacent l'est.

Oswald
la source
3
Je ne pense pas que ce soit toujours vrai pour les tables InnoDB.
Simon East
@SimonEast Pouvez-vous nous donner une raison pour laquelle vous pensez cela?
Arya
16

Cela dépend de la lower_case_table_namesvariable système:

show variables where Variable_name='lower_case_table_names'

Il existe trois valeurs possibles pour cela:

  • 0- la casse à lettres spécifiée dans l' instruction CREATE TABLEou CREATE DATABASE. Les comparaisons de noms sont sensibles à la casse.
  • 1 - Les noms de table sont stockés en minuscules sur le disque et les comparaisons de noms ne sont pas sensibles à la casse.
  • 2- la casse spécifiée dans l' instruction CREATE TABLEou CREATE DATABASE, mais MySQL les convertit en minuscules lors de la recherche. Les comparaisons de noms ne sont pas sensibles à la casse.

Documentation

Raman Sahasi
la source
11
  1. Localisez le fichier sur /etc/mysql/my.cnf

  2. Modifiez le fichier en ajoutant les lignes suivantes:

    [mysqld]

    lower_case_table_names=1

  3. sudo /etc/init.d/mysql restart

  4. courir mysqladmin -u root -p variables | grep tablepour vérifier que lower_case_table_namesc'est 1maintenant

Vous devrez peut-être recréer ces tables pour que cela fonctionne

sendon1982
la source