11.2.3 Чуткость идентификаторов к регистру
В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует по крайней мере одному файлу в каталоге базы данных (и, возможно, большему количеству, в зависимости от движка хранения). Триггеры также соответствуют файлам. Следовательно, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру имен баз данных, таблиц и триггеров. Это означает, что такие имена нечувствительны к регистру в Windows, но чувствительны к регистру в большинстве вариантов Unix. Одним из заметных исключений является macOS, который основан на Unix, но использует тип файловой системы по умолчанию (HFS+), который нечувствителен к регистру. Однако macOS также поддерживает объемы UFS, которые чувствительны к регистру, как и в любой системе Unix. См. Раздел 1.7.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 системы. lower_case_table_names может принимать значения, показанные в следующей таблице. Эта переменная не влияет на чувствительность к регистру идентификаторов триггеров. В Unix значение по умолчанию для lower_case_table_names равно 0. В Windows значение по умолчанию равно 1. В macOS значение по умолчанию равно 2.
lower_case_table_names может быть настроено только при инициализации сервера. Изменение lower_case_table_names после запуска сервера запрещено.
| Значение | Значение |
|---|---|
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на всех платформах, чтобы принудительно преобразовывать имена в нижний регистр.
Имена объектов могут считаться дубликатами, если их заглавные формы равны в соответствии с двоичным упорядочением. Это верно для имен курсоров, условий, процедур, функций, точек сохранения, параметров хранимых процедур, локальных переменных хранимых программ и плагинов. Это неверно для имен столбцов, ограничений, баз данных, партиций, операторов, подготовленных с помощью PREPARE, таблиц, триггеров, пользователей и пользовательских переменных.
Чувствительность файловой системы к регистру может повлиять на поиск в строковых столбцах INFORMATION_SCHEMA таблиц. Дополнительную информацию см. в Разделе 12.8.7, «Использование упорядочения в поисках INFORMATION_SCHEMA».
© 2025 Oracle
Licensed under the GPLv2 License.