Conversione delle tabelle sensibili alle maiuscole di MySQL

Ho una base di codice PHP che è stata scritta per indirizzare le nostre tabelle MySQL in casi misti. Ad esempio, xar_intakeformgenerator_ChangeLog .

Il nostro codice funziona anche su Windows, e prima che ne sapessimo di migliori, abbiamo importto diversi database su un server Windows. Ciò ha portto Windows MySQL a modificare tutti i nomi delle tabelle in lettere minuscole. ( xar_intakeformgenerator_changelog ). Ora sappiamo come impedire che ciò accada ai nuovi database. ( Set lower_case_table_names ) E, il codice funziona bene sui server Windows perché a MySQL non interessa il caso delle tabelle su Windows.

Ecco il problema Il server Windows ci sta dando dolore e abbiamo bisogno di spostare tutti i database su un server Linux. Poiché tutti i nomi delle tabelle sono stati convertiti in minuscolo, il codice NON functionrà su Linux. Fortunatamente, Xaraya crea mappature di tabelle. Quindi, in teoria, potrei creare una nuova base di codice per questi database e cambiare i mapping di each module per usare le tabelle minuscole. Oppure, potremmo modificare manualmente i nomi delle tabelle dopo averli importti sulla macchina Linux per get la tabella corretta.

la modifica di lower_case_table_names non corregge i database che sono stati manomessi prima che venisse impostato il flag. Questi hanno tutti i nomi delle tabelle in minuscolo.

Non sono pazzo di entrambe le opzioni. Qualcuno sa un modo ingegnoso per gestire questo?

OK. Ho trovato la mia risposta.

Sul server Linux, avevo bisogno di eseguire quanto segue per modificare tutti i nomi delle tabelle nei miei database generati da Linux in lettere minuscole:

  1. Come produrre uno script SQL che rinomina tutte le tabelle in uno schema nella sua forma di minuscolo:

     select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') from information_schema.tables where table_schema = 'your_schema_name'; 
  2. Rinominato i database in phpmyadmin in nomi in phpmyadmin minuscole.

  3. Modificato my.cnf sul server Linux per usare lower_case_table_names=1

  4. Mysql riavviato.

Dopo questo, il mio codice avrebbe funzionato con i nomi delle tabelle in minuscolo. Quindi, sono stato in grado di importre quelli di Windows e avere lo stesso codice di base su entrambi.

Se ricordo bene ( ho avuto lo stesso tipo di problema un po 'di tempo fa – ma ho smesso di lavorare su quel progetto prima che decidessimo quale soluzione adottare …) , c'è un'opzione di configuration che dice come usare il nome del tableau (caso- sensibile o non sensibile al maiuscolo / minuscolo).

Ecco cosa ho trovato: Identifier Case Sensitivity

Citando quella pagina:

Se si utilizza MySQL su una sola piattaforma, normalmente non è necessario modificare la variabile lower_case_table_names dal valore predefinito. Tuttavia, è ansible incontrare difficoltà se si desidera trasferire tabelle tra piattaforms diverse per la distinzione tra maiuscole e minuscole nel file system. Ad esempio, su Unix, puoi avere due tabelle diverse denominate my_table e MY_TABLE , ma su Windows questi due nomi sono considerati identici. Per evitare problemi di trasferimento dati derivanti da lettere minuscole di nomi di database o tabelle, hai due opzioni:

  • Usa lower_case_table_names=1 su tutti i sisthemes. Lo svantaggio principale di questo è che quando usate SHOW TABLES o SHOW DATABASES , non vedete i nomi nella loro originale lettera maiuscola.

    • Usa lower_case_table_names=0 su Unix e lower_case_table_names=2 su Windows. Ciò mantiene la lettera maiuscola dei nomi di database e tabelle.

(C'è dell'altro che non ho fatto copia-incolla, quindi leggere questa pagina potrebbe essere una buona idea ;-))

Spero che questo aiuti …

lower_case_table_names

Per Windows, per impostazione predefinita "crea tutto in lettere minuscole" (1). Impostalo su 2: "Case insensitive ma mantieni il caso così com'è".

Queste modifiche vanno nel tuo my.cnf