9.2.3 Чуткость идентификаторов к регистру
В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует по меньшей мере одному файлу в каталоге базы данных (и возможно больше, в зависимости от используемого движка хранения). Триггеры также соответствуют файлам. Следовательно, чувствительность к регистру базовой операционной системы влияет на чувствительность к регистру имен баз данных, таблиц и триггеров. Это означает, что такие имена нечувствительны к регистру в Windows, но чувствительны к регистру в большинстве вариантов Unix. Заметное исключение составляет macOS, основанный на Unix, но использующий по умолчанию тип файловой системы (HFS+), который нечувствителен к регистру. Однако macOS также поддерживает объемы UFS, которые чувствительны к регистру, как и в любой Unix-системе. См. Раздел 1.6.1, «Расширения MySQL для стандартного SQL». Переменная системы lower_case_table_names также влияет на то, как сервер обрабатывает чувствительность идентификаторов к регистру, как описано позже в этом разделе.
Хотя имена баз данных, таблиц и триггеров нечувствительны к регистру на некоторых платформах, вы не должны ссылаться на один из них с использованием разных регистров в одном и том же операторе. Следующий оператор не будет работать, поскольку он ссылается на таблицу как на my_table, так и как на MY_TABLE:
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
Имена столбцов, индексов, хранимых процедур и событий нечувствительны к регистру ни на какой платформе, также как и псевдонимы столбцов.
Однако имена групп файлов журналов чувствительны к регистру. Это отличается от стандартного SQL.
По умолчанию псевдонимы таблиц чувствительны к регистру в Unix, но нечувствительны в Windows или macOS. Следующий оператор не будет работать в Unix, поскольку он ссылается на псевдоним как на a, так и как на A:
mysql> SELECT col_name FROM tbl_name AS a
WHERE a.col_name = 1 OR A.col_name = 2;
Однако этот же оператор разрешен в Windows. Чтобы избежать проблем, вызванных такими различиями, лучше всего принять согласованную конвенцию, например, всегда создавать и ссылаться на базы данных и таблицы с использованием строчных букв. Эта конвенция рекомендуется для максимальной переносимости и простоты использования.
Способ хранения имен таблиц и баз данных на диске и их использование в MySQL зависят от переменной системы lower_case_table_names, которую можно установить при запуске mysqld. lower_case_table_names может принимать значения, показанные в следующей таблице. Эта переменная не влияет на чувствительность к регистру идентификаторов триггеров. В Unix значение по умолчанию для lower_case_table_names равно 0. В Windows значение по умолчанию равно 1. В macOS значение по умолчанию равно 2.
| Значение | Значение |
|---|---|
0 | Имена таблиц и баз данных хранятся на диске с использованием регистра, указанного в операторе CREATE
TABLE или CREATE
DATABASE. Сравнения имен чувствительны к регистру. Не следует устанавливать эту переменную в 0, если вы используете MySQL на системе с нечувствительными к регистру именами файлов (например, Windows или macOS). Если вы принудительно устанавливаете эту переменную в 0 с помощью --lower-case-table-names=0 в файловой системе, нечувствительной к регистру, и обращаетесь к MyISAM именам таблиц с разными регистрами, может произойти повреждение индекса. |
1 | Имена таблиц хранятся в нижнем регистре на диске, и сравнения имен нечувствительны к регистру. MySQL преобразует все имена таблиц в нижний регистр при хранении и поиске. Это поведение также применяется к именам баз данных и псевдонимам таблиц. |
2 | Имена таблиц и баз данных хранятся на диске с использованием регистра, указанного в операторе CREATE
TABLE или CREATE
DATABASE, но MySQL преобразует их в нижний регистр при поиске. Сравнения имен нечувствительны к регистру. Это работает только в файловых системах, которые нечувствительны к регистру! InnoDB имена таблиц и имен представлений хранятся в нижнем регистре, как и для lower_case_table_names=1. |
Если вы используете MySQL только на одной платформе, обычно вам не нужно изменять переменную lower_case_table_names от её значения по умолчанию. Однако могут возникнуть трудности, если вы хотите перенести таблицы между платформами, которые отличаются по чувствительности файловой системы к регистру. Например, в Unix вы можете иметь две разные таблицы с именами my_table и MY_TABLE, но в Windows эти два имени считаются идентичными. Чтобы избежать проблем с передачей данных, возникающих из-за регистра имён баз данных или таблиц, у вас есть два варианта:
Используйте
lower_case_table_names=1на всех системах. Главным недостатком этого является то, что при использованииSHOW TABLESилиSHOW DATABASES, вы не видите имена в их исходном регистре.-
Используйте
lower_case_table_names=0в Unix иlower_case_table_names=2в Windows. Это сохраняет регистр имён баз данных и таблиц. Недостатком этого является то, что необходимо убедиться, что ваши операторы всегда ссылаются на ваши имена баз данных и таблиц с правильным регистром в Windows. Если вы перенесёте свои операторы в Unix, где регистр имеет значение, они не будут работать, если регистр неверен.Исключение: Если вы используете
InnoDBтаблицы и пытаетесь избежать этих проблем с передачей данных, следует установитьlower_case_table_namesв 1 на всех платформах, чтобы принудительно преобразовывать имена в нижний регистр.
Если вы планируете установить переменную системы lower_case_table_names в 1 в Unix, необходимо сначала преобразовать старые имена баз данных и таблиц в нижний регистр, прежде чем останавливать mysqld и перезапускать его с новым значением переменной. Для преобразования отдельной таблицы используйте RENAME TABLE:
RENAME TABLE T1 TO t1;
Чтобы преобразовать одну или несколько целых баз данных, сделайте дамп перед установкой lower_case_table_names, затем удалите базы данных и загрузите их после установки lower_case_table_names:
-
Используйте mysqldump для создания дампа каждой базы данных:
mysqldump --databases db1 > db1.sql mysqldump --databases db2 > db2.sql ...
Сделайте это для каждой базы данных, которую нужно пересоздать.
Используйте
DROP DATABASEдля удаления каждой базы данных.Остановите сервер, установите
lower_case_table_namesи перезапустите сервер.-
Загрузите файл дампа для каждой базы данных. Поскольку
lower_case_table_namesустановлено, каждое имя базы данных и таблицы преобразуется в нижний регистр при его повторном создании:mysql < db1.sql mysql < db2.sql ...
Имена объектов могут рассматриваться как дубликаты, если их верхние регистры равны в соответствии с двоичным сравнением. Это верно для имён курсоров, условий, процедур, функций, точек сохранения, параметров хранимых процедур, локальных переменных хранимых программ и плагинов. Это неверно для имён столбцов, ограничений, баз данных, разделов, операторов, подготовленных с помощью PREPARE, таблиц, триггеров, пользователей и пользовательских переменных.
Чувствительность файловой системы к регистру может влиять на поиск в строковых столбцах INFORMATION_SCHEMA таблиц. Для получения дополнительной информации см. Раздел 10.8.7, «Использование сортировки в поисках INFORMATION_SCHEMA».
© 2025 Oracle
Licensed under the GPLv2 License.