Configuration de la sensibilité à la casse dans MySQL

Dans l'univers de la gestion de bases de données, une recommandation revient systématiquement : nommer les tables et les bases de données en minuscules. Cette règle n'est pas arbitraire, elle découle de la manière dont MySQL interagit avec le système d'exploitation hôte et de la gestion du paramètre système lower_case_table_names.

L'impact du système d'exploitation et du paramètre global

Le comportement de MySQL dépend étroitement de la plateforme sur laquelle il est installé. Sous Windows, le système de fichiers n'est pas sensible à la casse, alors que sous Linux, il l'est. Par défaut, MySQL suit cette logique : les noms de tables sont insensibles à la casse sous Windows et sensibles sous Linux. En revanche, les noms de colonnes, d'index et de procédures stockées restent insensibles à la casse quelle que soit la plateforme.

Le paramètre lower_case_table_names définit précisément la manière dont les identifiants sont stockés sur le disque et comparés lors des requêtes :

Valeur Description du comportement
0 Les noms sont stockés tels qu'ils sont écrits dans l'instruction CREATE. Les comparaisons sont sensibles à la casse (comportement par défaut sur Linux).
1 Les noms sont convertis et stockés en minuscules. Les comparaisons ne sont pas sensibles à la casse (comportement par défaut sur Windows).
2 Les noms sont stockés avec la casse d'origine, mais MySQL les convertit en minuscules lors des recherches (comportement par défaut sur macOS).

Analyse du comportement avec lower_case_table_names = 0

Lorsque cette valeur est activée sur un système Linux, MySQL traite les majuscules et les minuscules comme des caractères distincts. Voici une démonstration technique :

-- Vérification de la configuration
SHOW VARIABLES LIKE 'lower_case_table_names';
-- Résultat : 0

-- Création de deux bases de données distinctes par la casse
CREATE DATABASE Prod_Data;
CREATE DATABASE prod_data;

-- Liste des bases (les deux coexistent)
SHOW DATABASES;
-- +--------------------+
-- | Database           |
-- +--------------------+
-- | Prod_Data          |
-- | prod_data          |
-- +--------------------+

USE prod_data;

-- Création d'une table avec une casse spécifique
CREATE TABLE Inventaire_Global (
    ref_id INT AUTO_INCREMENT PRIMARY KEY,
    nom_produit VARCHAR(50)
) ENGINE=InnoDB;

-- Cette requête fonctionne
SELECT * FROM Inventaire_Global;

-- Cette requête échoue car la table 'inventaire_global' n'existe pas
SELECT * FROM inventaire_global;
-- ERROR 1146 (42S02): Table 'prod_data.inventaire_global' doesn't exist

Dans ce mode, la confusion est facile. Si deux développeurs travaillent sur le même projet, l'un pourrait appeler une table Logs et l'autre logs, créant ainsi des doublons structurels et des erreurs de maintenance majeures.

Analyse du comportement avec lower_case_table_names = 1

C'est le mode recommandé pour assurer une portabilité maximale entre différents environnements (développement sous Windows, production sous Linux).

-- Après modification du fichier de configuration et redémarrage
SHOW VARIABLES LIKE 'lower_case_table_names';
-- Résultat : 1

CREATE DATABASE Gestion_Stocks;
-- MySQL crée silencieusement 'gestion_stocks'

-- Tentative de créer un doublon (Échec)
CREATE DATABASE gestion_stocks;
-- ERROR 1007 (HY000): Can't create database 'gestion_stocks'; database exists

USE gestion_stocks;

CREATE TABLE Clients_Actifs (id INT);

-- Toutes ces requêtes ciblent la même table
SELECT * FROM Clients_Actifs;
SELECT * FROM clients_actifs;
SELECT * FROM CLIENTS_ACTIFS;

Migration et points de vigilance

Le paramètre lower_case_table_names ne peut pas être modifié dynamiquement via une commande SQL. Il nécessite une modification du fichier de configuration (my.cnf ou my.ini) suivie d'un redémarrage du service.

Attention : Si vous passez d'une valeur 0 à 1 alors que vous possédez déjà des tables contenant des majuscules, ces tables deviendront inaccessibles. MySQL cherchera la vertion en minuscules sur le disque et ne la trouvera pas.

Pour migrer en toute sécurité, vous devez renommer vos tables en minuscules avant de changer le paramètre. Voici comment identifier les tables problématiques et générer les scripts de renommage :

-- Identifier les tables contenant des majuscules dans le nom
SELECT 
    TABLE_SCHEMA, 
    TABLE_NAME 
FROM 
    information_schema.TABLES 
WHERE 
    TABLE_SCHEMA NOT IN ('information_schema', 'mysql', 'performance_schema', 'sys') 
    AND TABLE_NAME REGEXP BINARY '[A-Z]';

-- Générer les instructions de renommage automatique
SELECT 
    CONCAT('RENAME TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, 
           ' TO ', TABLE_SCHEMA, '.', LOWER(TABLE_NAME), ';') AS rename_script
FROM 
    information_schema.TABLES 
WHERE 
    TABLE_SCHEMA = 'NOM_DE_VOTRE_BASE';

Si vous devez également changer la casse du nom de la base de données, la méthode la plus fiable consiste à créer une nouvelle base en minuscules et à y déplacer les tables une par une à l'aide de la commande RENAME TABLE base_A.table_1 TO base_b.table_1.

Étiquettes: MySQL DatabaseAdministration SQL Configuration Linux

Publié le 22 juin à 22h19