I nomi delle tabelle in MySQL fanno distinzione tra maiuscole e minuscole?


173

I nomi delle tabelle in MySQL fanno distinzione tra maiuscole e minuscole?

Sulla mia macchina di sviluppo Windows il codice che ho è in grado di interrogare le mie tabelle che sembrano essere tutte minuscole. Quando eseguo la distribuzione sul server di prova nel nostro datacenter, i nomi delle tabelle sembrano iniziare con una lettera maiuscola.

I server che utilizziamo sono tutti su Ubuntu.


Risposte:


203

In generale:

I nomi di database e tabelle non fanno distinzione tra maiuscole e minuscole in Windows e distingue tra maiuscole e minuscole nella maggior parte delle varietà di Unix.

In MySQL, i database corrispondono alle directory all'interno della directory dei dati. Ogni tabella all'interno di un database corrisponde ad almeno un file nella directory del database. Di conseguenza, la distinzione tra maiuscole e minuscole del sistema operativo sottostante gioca un ruolo nella distinzione tra maiuscole e minuscole dei nomi di database e tabelle.

Si può configurare il modo in cui i nomi delle tabelle sono memorizzati sul disco usando la variabile di sistema lower_case_table_names(nel file di configurazione my.cnf in [mysqld]).

Leggi la sezione: 10.2.2 Sensibilità caso identificatore per ulteriori informazioni.


40
Questo mi ha completamente bruciato perché il mio codice stava funzionando benissimo nel mio ambiente Windows locale, ma generando eccezioni quando è stato spostato in produzione su Linux !! Grazie!
portforwardpodcast,

6
C'è una avvertenza a questa risposta, che non è menzionata nella documentazione: InnoDB non usa nomi di file o directory per database e tabelle, e quindi i suoi oggetti non fanno mai distinzione tra maiuscole e minuscole, anche quando vengono eseguiti su un sistema sensibile al maiuscolo / minuscolo. Vedi questa domanda per un esempio di cosa può andare storto a causa di ciò: stackoverflow.com/questions/23182969/…
Jules

questa non è tutta la storia. vedi la risposta di StephenLembert come configurabile
Chris Wood,

1
Per impostazione predefinita, la maggior parte dei computer Mac utilizza un file system senza distinzione tra maiuscole e minuscole. Puoi optare per avere la distinzione tra maiuscole e minuscole nel tuo file system.
Chad,

Questa e la distinzione tra maiuscole e minuscole del nome del file è uno dei motivi che mi ha portato a passare a Ubuntu come sviluppatore web.
Muhammad bin Yusrat,

99

I nomi di database e tabelle non fanno distinzione tra maiuscole e minuscole in Windows e distingue tra maiuscole e minuscole nella maggior parte delle varietà di Unix o Linux.

per risolvere il problema, impostare lower_case_table_names su 1

lower_case_table_names = 1

questo renderà tutte le tue tabelle minuscole, non importa come le scrivi


1
Inoltre, non fanno distinzione tra maiuscole e minuscole su MacOS X, anche se lo è Unix sottostante. Questo è presumibilmente il motivo per cui il completamento automatico all'interno di MySQL su Mac fa distinzione tra maiuscole e minuscole per i nomi di tabelle o campi, anche se le query non lo sono.
David

Sì, ma lì per mettere questa affermazione? Immagino sia su: /etc/mysql/my.cnf sotto il gruppo [mysql]. Ma questo non è abbastanza, c'è ancora qualcos'altro da fare (oltre ovviamente a riavviare mysql ...
Alg_D

1
Questo riguarda solo le nuove tabelle. Le tabelle esistenti devono essere rinominate in minuscolo prima di modificare questa impostazione.
Martin,

19

I nomi delle tabelle in MySQL sono voci del file system, quindi non fanno distinzione tra maiuscole e minuscole se è il file system sottostante.


3
Non credo sia sempre vero per le tabelle InnoDB.
Simon East,

@SimonEast Per favore, potresti dare una ragione per cui lo pensi?
Arya,

16

Dipende dalla lower_case_table_namesvariabile di sistema:

show variables where Variable_name='lower_case_table_names'

Esistono tre valori possibili per questo:

  • 0- lettere maiuscole specificate nell'istruzione CREATE TABLEo CREATE DATABASE. I confronti dei nomi fanno distinzione tra maiuscole e minuscole.
  • 1 - I nomi delle tabelle sono memorizzati in minuscolo sul disco e i confronti dei nomi non fanno distinzione tra maiuscole e minuscole.
  • 2- lettere maiuscole specificate nell'istruzione CREATE TABLEo CREATE DATABASE, ma MySQL le converte in lettere minuscole alla ricerca. I confronti dei nomi non fanno distinzione tra maiuscole e minuscole.

Documentazione


11
  1. Trova il file su /etc/mysql/my.cnf

  2. Modifica il file aggiungendo le seguenti righe:

    [mysqld]

    lower_case_table_names=1

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

  4. corri mysqladmin -u root -p variables | grep tableper controllare che lower_case_table_namessia 1adesso

Potrebbe essere necessario ricreare queste tabelle per farlo funzionare

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.