2012-02-25 9 views
6

Il problema è che stiamo lavorando su Windows Machine e, una volta fatto, distribuiamo il codice sulla macchina UNIX. Il codice funziona bene su Windows ma poi in Unix si ottiene l'errore come 'nessuna tabella esiste' dopo aver cambiato il nome della tabella nel caso corretto funziona anche in unix. In realtà, in Windows non esistono nomi di tabelle sensibili alle maiuscole e minuscole per impostazione predefinita, ma in unix hanno (leggi che le tabelle MySQL sono in realtà file e in Unix abbiamo il nome del file con distinzione tra maiuscole e minuscole ma non in Windows). La soluzione alternativa potrebbe essere quella di creare nuovamente tutte le tabelle e di avere il nome della tabella in minuscolo. Sì, possiamo farlo anche questo, va bene.Come applicare la distinzione tra maiuscole e minuscole nei nomi di tabelle e colonne in MySql?

Tuttavia, è ancora possibile imporre la distinzione tra maiuscole e minuscole nei nomi di tabelle in MySql (Windows Machine). Se sì, allora fammi sapere come farlo.

+0

questa è una domanda interessante. Causa problemi come il tuo SQL funzionano in Windows e non nel sistema basato su Unix. AFAIK, non c'è soluzione al riguardo. – Nishant

risposta

4

Su Unix, il valore predefinito di lower_case_table_names è 0. Su Windows, il valore predefinito è 1. Su Mac OS X, il valore predefinito è 1 prima di MySQL 4.0.18 e 2 a partire dalla 4.0.18.

Per risolvere questo problema, è possibile cercare l'impostazione: lower_case_table_names nel file my.ini, trovato in: C: \ Programmi \ MySQL \ MySQL Server 4.1, a seconda della versione in esecuzione. Se non si trova l'impostazione, si può semplicemente aggiungere alla fine del file my.ini, come ho fatto io, in questo modo:

lower_case_table_names=0 

Ricordarsi di riavviare il servizio MySQL prima di verificare se Funziona.

Se si utilizza MySQL su una sola piattaforma, normalmente non è necessario modificare la variabile lower_case_table_names dal valore predefinito. Tuttavia, è possibile incontrare difficoltà se si desidera trasferire tabelle tra piattaforme 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 quei nomi sono considerati identici. Per evitare problemi di trasferimento dati derivanti da lettere di database o nomi di tabelle, hai due opzioni:

Usa lower_case_table_names = 1 su tutti i sistemi. 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. Lo svantaggio di questo è che devi assicurarti che le tue affermazioni facciano sempre riferimento al tuo database e ai nomi delle tabelle con il corretto valore letterale di Windows. Se trasferisci le tue istruzioni su Unix, dove la lettera maiuscola è significativa, non funzionano se la lettera maiuscola è errata.

Eccezione: se si utilizzano le tabelle InnoDB e si tenta di evitare questi problemi di trasferimento dei dati, è necessario impostare lower_case_table_names su 1 su tutte le piattaforme per forzare i nomi da convertire in lettere minuscole.

Se si pianifica di impostare la variabile di sistema lower_case_table_names su 1 su Unix, è necessario prima convertire i vecchi database e nomi di tabelle in minuscolo prima di arrestare mysqld e riavviarlo con la nuova impostazione di variabile.

Si prega di consultare il sito web di MySQL per ulteriori informazioni su questo, e alcune avvertenze importanti http://dev.mysql.com/doc/refman/4.1/en/identifier-case-sensitivity.html

5

L'impostazione è chiamato lower_case_table_names. Se lo si imposta su 0, i confronti saranno case sensitive.

Tuttavia,

Si consiglia di non impostare questa variabile a 0 se si esegue MySQL su un sistema che ha i nomi di file case-insensitive (come Windows o Mac OS X). Se si impone questa variabile a 0 con --lower-case-table-names = 0 su un file system senza distinzione tra maiuscole e minuscole e si accede a nomi di tabelle MyISAM utilizzando diverse lettere maiuscole, può verificarsi il danneggiamento dell'indice.

rendendo tutti i nomi di tabella in minuscolo su tutti i sistemi (incluso Linux), es. impostandolo a un valore di 1, suona come l'opzione migliore:

nomi delle tabelle vengono memorizzati in minuscolo sul confronto di disco e il nome non sono case sensitive. MySQL converte tutti i nomi delle tabelle in lettere minuscole su spazio di archiviazione e ricerca. Questo comportamento si applica anche ai nomi di database e alias di tabella.

+0

Problema: è possibile modificare le impostazioni nella macchina Windows ma non nel sistema Unix. Con questa soluzione, se ho accesso al file my.ini in unix, potrei modificare questa impostazione su 1 e risolverebbe il problema. Ma voglio quell'altro modo. Significa invece che creare tabelle in unix senza distinzione tra maiuscole e minuscole mi piacerebbe avere tabelle sensibili alla distinzione tra maiuscole e minuscole. –

+0

@Rakesh vedi l'opzione '0', ma non è raccomandato. Non vedo come questo problema si verifica in primo luogo però - non puoi semplicemente assicurarti che il tuo codice stia usando i nomi giusti? I nomi delle tabelle vengono modificati a un certo punto durante la distribuzione su Linux? –

Problemi correlati