web-dev-qa-db-fra.com

Comment modifier les noms de table MySQL sur un serveur Linux pour qu'ils ne tiennent pas compte de la casse?

Je travaille sur un ancien site Web qui était hébergé sur un serveur Apple. Quand il a migré sur un nouveau serveur Linux, il a cessé de fonctionner. Je suis presque sûr que c'est parce que toutes les requêtes MySQL utilisées dans les scripts php ont des combinaisons de casse différentes pour les noms de table (je ne sais pas pourquoi les développeurs d'origine n'ont suivi aucune convention lorsqu'ils ont créé les noms de table ou les scripts php ) et cela n’a pas d’importance, car les serveurs Mac et Windows MySQL sont insensibles à la casse par défaut. Cependant, Linux ne l’est pas.

Existe-t-il un moyen de modifier la valeur par défaut de Linux sur MySQL afin qu'elle devienne insensible à la casse et fonctionne comme un Mac ou Windows? J'ai cherché mais je n'ai pas trouvé de réponses qui n'impliquent aucune modification des scripts, des noms de table ou des deux. Le site Web doit avoir été généré à l'aide d'un CMS. Il y a donc des dizaines et des dizaines de pages et inclure des fichiers contenant plusieurs requêtes dans des centaines de tables. J'ai commencé à essayer d'implémenter ce type de solution de la manière la plus intelligente possible, mais si je touche les noms de table, les autres pages en cours de travail cessent de fonctionner (j'essaie d'éviter de casser davantage le site).

Il y avait une variable système (lower_case_table_names) dans la console du serveur MySQL dans Webmin sur le serveur Linux que je lisais qui pourrait être changé de 0 à 1 pour résoudre ce problème, mais Webmin ne me laissera pas le changer car il s'agit d'une "lecture seule". "variable.

Vous penseriez que ce serait un problème facile à résoudre, mais jusqu'à présent, je perds espoir. J'espère que quelqu'un aura une réponse qui m'échappera peut-être pour le moment.

14
rocklandcitizen

La sensibilité à la casse de MySQL est gérée par défaut par le système de fichiers. C'est pourquoi vous avez constaté cette différence:

9.2.2. Sensibilité à la casse de l'identifiant

Dans MySQL, les bases de données correspondent aux répertoires du répertoire de données. Chaque table dans une base de données correspond à au moins un fichier dans le répertoire de la base de données (et éventuellement plus, en fonction du moteur de stockage). 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. Cela signifie que les noms de bases de données et de tables ne sont pas sensibles à la casse dans Windows, et à la casse dans la plupart des variétés d'Unix. Mac OS X constitue une exception notable. Il est basé sur Unix mais utilise un type de système de fichiers par défaut (HFS +) qui ne respecte pas la casse. Toutefois, Mac OS X prend également en charge les volumes UFS, qui sont sensibles à la casse, comme sur tout système Unix. Reportez-vous à la Section 1.8.4, «Extensions MySQL au SQL standard». 

Heureusement, la phrase suivante pourrait vous aider:

La variable lower_case_table_names system affecte également la façon dont le serveur gère la sensibilité à la casse des identificateurs, comme décrit plus loin dans cette section. 

Le lower_case_table_names:

Si la valeur est 0, les noms de table sont stockés comme spécifié et les comparaisons sont sensibles à la casse. Si la valeur est définie sur 1, les noms de table sont stockés en minuscule sur le disque et les comparaisons ne sont pas sensibles à la casse. Si la valeur est 2, les noms de table sont stockés tels quels mais comparés en minuscules. Cette option s'applique également aux noms de base de données et aux alias de table. Pour plus d'informations, reportez-vous à la Section 9.2.2, «Sensibilité à la casse de l'identificateur».

Vous ne devez pas définir cette variable sur 0 si vous exécutez MySQL sur un système comportant des noms de fichier non sensibles à la casse (tels que Windows ou Mac OS X). Si vous définissez cette variable sur 0 sur un tel système et que vous accédez aux noms de tables MyISAM à l'aide de cas de lettre différents, il peut en résulter une corruption de l'index. Sous Windows, la valeur par défaut est 1. Sous Mac OS X, la valeur par défaut est 2.

Il semble donc que vous devriez définir lower_case_table_names à 1 dans le fichier de configuration MySQL.

16
Kevin

Il existe une variable serveur MySQL portant le même nom . Vous aurez probablement besoin de définir cette variable spécifique au démarrage du système, comme décrit dans cette page d'aide . Vous devrez trouver l’emplacement du fichier d’options MySQL (le mien est à /etc/my.cnf) pour votre instance de serveur de base de données et éditer/ajouter cette option à la section [mysqld].

N'oubliez pas de redémarrer le démon MySQL après ...

13
thkala

Editer le fichier de configuration mysql

nano /etc/mysql/my.cnf

ou tout autre fichier my.cnf utilisé pour configurer votre mysql.

Sous 

[mysqld]

ajouter la ligne 

lower_case_table_names=1

Courir 

Sudo service mysqld restart

Vous voudrez peut-être réimporter votre base de données Windows dans votre base de données Linux. De préférence à partir de zéro, avec les instructions add table et insert.

C'est bon!

9
Sébastien

Vous ne pouvez pas changer la valeur de lower_case_table_names lorsque mysql est en cours d'exécution - il doit être défini au démarrage. Vous devrez éditer my.cnf (peut-être dans /etc, peut-être ailleurs, pas sûr). Ensuite, redémarrez MySQL et vous devriez être bon.

3
Keith Randall

Le paramètre lower_case_table_names doit être défini dans le cadre d'un groupe de paramètres de base de données personnalisé avant de créer une instance de base de données. Évitez de modifier le paramètre lower_case_table_names pour les instances de base de données existantes, car cela pourrait entraîner des incohérences avec les sauvegardes de récupération à un moment donné et les instances de base de données de réplica en lecture.

0
Musa