Статьи

MySQL кроссплатформенное именование таблиц

MySQL table names Разработчики редко учитывают верхний, нижний или верблюжий имена таблиц MySQL. К сожалению, это может вызвать серьезные головные боли, если вы собираетесь портировать свое приложение из среды разработки Windows или Mac на хост на базе Linux или Unix.

Название таблицы Чувствительность к регистру

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


CREATE MyTable (
  id SMALLINT unsigned NOT NULL,
  name VARCHAR(50)
)

Затем мы запускаем следующий запрос в нашем коде:

 
SELECT id, name FROM mytable WHERE id = 1;

Этот запрос будет корректно работать на хосте Windows или Mac. К сожалению, произойдет сбой, как только ваше приложение будет скопировано в Linux или Unix.

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

lower_case_table_names

lower_case_table_names — системная переменная MySQL, которая контролирует, как база данных разрешает регистр имен таблиц. Его можно передать в качестве параметра запуска для mysqld или в my.ini (хотя известно, что это приводит к сбою в более ранних версиях MySQL). Значение может быть установлено на:

0 (Linux / Unix по умолчанию)
Сравнения имен таблиц чувствительны к регистру. Таблицы хранятся на диске, используя указанный регистр букв.

1 (по умолчанию в Windows)
Сравнения имен таблиц не чувствительны к регистру. MySQL преобразует все имена таблиц в нижний регистр при хранении и поиске.

2 (Mac по умолчанию)
Сравнения имен таблиц не чувствительны к регистру. Таблицы MyISAM хранятся на диске, используя указанный регистр букв, но MySQL преобразует их в нижний регистр при поиске. Таблицы InnoDB хранятся в нижнем регистре.

Поэтому заманчиво установить в вашей системе lower_case_table_names на ноль. Однако пользователи Windows не должны этого делать. Руководство предупреждает, что, если вы установите строчные имена таблиц в нижнем регистре = 0 в файловой системе без учета регистра и получите доступ к именам таблиц MyISAM, используя разные регистры букв, это может привести к повреждению индекса. Насти.

рекомендации

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

Смотрите также:

Обнаружил ли вас когда-нибудь корпус таблицы MySQL?