Являются ли имена таблиц в MySQL чувствительными к регистру?

173

Являются ли имена таблиц в MySQL чувствительными к регистру?

На моей машине для разработки Windows код, который у меня есть, может запрашивать мои таблицы, которые выглядят строчными. При развертывании на тестовом сервере в нашем центре данных имена таблиц начинаются с заглавной буквы.

Все серверы, которые мы используем, находятся на Ubuntu.

benstpierre
источник
3
dev.mysql.com/doc/refman/5.6/en/…
Сэм Дюфель

Ответы:

203

В основном:

Имена баз данных и таблиц не чувствительны к регистру в Windows, и чувствительны к регистру в большинстве разновидностей Unix.

В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует как минимум одному файлу в каталоге базы данных. Следовательно, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру имен баз данных и таблиц.

Можно настроить способ хранения имен таблиц на диске с помощью системной переменной lower_case_table_names(в файле конфигурации my.cnf в [mysqld]).

Прочитайте раздел: 10.2.2 Идентификатор чувствительности к регистру для получения дополнительной информации.

CloudyMarble
источник
40
Это полностью обожгло меня, так как мой код прекрасно работал в моей локальной среде Windows, но создавал исключения, когда переходил в производство на Linux! Спасибо!
portforwardpodcast
6
На этот ответ есть одно предостережение, которое не упомянуто в документации: InnoDB не использует имена файлов или каталогов для баз данных и таблиц, и поэтому его объекты всегда нечувствительны к регистру, даже если они запускаются в чувствительной к регистру системе. Посмотрите этот вопрос для примера того, что может пойти не так из-за этого: stackoverflow.com/questions/23182969/…
Жюль
это не вся история. см. ответ Стивена Лемберта, как он настраивается
Крис Вуд
1
По умолчанию большинство компьютеров Mac используют файловую систему без учета регистра. Вы можете подписаться, чтобы ваша файловая система чувствительна к регистру.
Чад
Это и чувствительность к регистру имен файлов являются одной из причин, по которой я перешел на Ubuntu в качестве веб-разработчика.
Мухаммед бин Юсрат
99

Имена баз данных и таблиц не чувствительны к регистру в Windows, и чувствительны к регистру в большинстве разновидностей Unix или Linux.

Чтобы решить проблему, установите для параметра lower_case_table_names значение 1

lower_case_table_names = 1

это сделает все ваши таблицы строчными, независимо от того, как вы их пишете

StephenLembert
источник
1
Они также не чувствительны к регистру в MacOS X, хотя в основе лежит Unix. Вероятно, именно поэтому автозаполнение в MySQL на Mac учитывает регистр имен таблиц или полей, даже если запросы не являются.
Дэвид
Да, но есть ли поставить это утверждение? Я предполагаю, что он находится в /etc/mysql/my.cnf под группой [mysql]. Но этого недостаточно, все же нужно еще кое-что сделать (кроме, конечно, перезапустить mysql ...
Alg_D
1
Это влияет только на новые таблицы. Существующие таблицы должны быть переименованы в нижний регистр перед изменением этого параметра.
Мартин,
19

Имена таблиц в MySQL являются записями файловой системы, поэтому они не чувствительны к регистру, если базовая файловая система такова.

Освальд
источник
3
Я не думаю, что это всегда верно для таблиц InnoDB.
Саймон Ист
@SimonEast Приведите, пожалуйста, причину, по которой вы так думаете?
Арья
16

Это зависит от lower_case_table_namesсистемной переменной:

show variables where Variable_name='lower_case_table_names'

Есть три возможных значения для этого:

  • 0- буква, указанная в заявлении CREATE TABLEили CREATE DATABASE. Сравнение имен чувствительно к регистру.
  • 1 - Имена таблиц хранятся в нижнем регистре на диске, а сравнения имен не чувствительны к регистру.
  • 2- lettercase, указанный в операторе CREATE TABLEor CREATE DATABASE, но MySQL преобразует их в нижний регистр при поиске. Сравнение имен не чувствительно к регистру.

Документация

Раман Сахаси
источник
11
  1. Найдите файл в /etc/mysql/my.cnf

  2. Отредактируйте файл, добавив следующие строки:

    [mysqld]

    lower_case_table_names=1

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

  4. бежать , mysqladmin -u root -p variables | grep tableчтобы проверить , что lower_case_table_namesэто в 1настоящее время

Возможно, вам придется заново создать эти таблицы, чтобы заставить его работать

sendon1982
источник