Spec-Zone.ru › MySQL 5.7

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:

  1. Используйте mysqldump для создания дампа каждой базы данных:

    mysqldump --databases db1 > db1.sql
    mysqldump --databases db2 > db2.sql
    ...
    

    Сделайте это для каждой базы данных, которую нужно пересоздать.

  2. Используйте DROP DATABASE для удаления каждой базы данных.

  3. Остановите сервер, установите lower_case_table_names и перезапустите сервер.

  4. Загрузите файл дампа для каждой базы данных. Поскольку 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/identifier-case-sensitivity.html

Spec-Zone.ru

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