Spec-Zone.ru › MySQL 9.2

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 на системе с нечувствительными к регистру именами файлов и получаете доступ к именам таблиц с использованием разных регистров, это может привести к повреждению индекса.
1 Имена таблиц хранятся в нижнем регистре на диске, и сравнение имён нечувствительно к регистру. MySQL преобразует все имена таблиц в нижний регистр при хранении и поиске. Это поведение также применяется к именам баз данных и псевдонимам таблиц.
2 Имена таблиц и баз данных хранятся на диске с использованием регистра, указанного в операторе CREATE TABLE или CREATE DATABASE, но MySQL преобразует их в нижний регистр при поиске. Сравнение имён нечувствительно к регистру. Это работает только на файловых системах, которые нечувствительны к регистру! Имена таблиц и представлений lower_case_table_names=1 хранятся в нижнем регистре, как и 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/identifier-case-sensitivity.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API