Spec-Zone .ru
спецификации, руководства, описания, API

9.2.2. Чувствительность к регистру идентификатора

В MySQL базы данных соответствуют каталогам в пределах каталога данных. Каждая таблица в пределах базы данных соответствует по крайней мере одному файлу в пределах каталога базы данных (и возможно больше, в зависимости от механизма хранения). Триггеры также соответствуют файлам. Следовательно, чувствительность случая базовой операционной системы играет роль в чувствительности случая базы данных, таблицы, и триггерных имен. Это означает, что такие имена не являются чувствительными к регистру в Windows, но являются чувствительными к регистру в большинстве вариантов Unix. Одним известным исключением является Mac OS X, который Основан на Unix, но использует тип файловой системы значения по умолчанию (HF +), который не является чувствительным к регистру. Однако, Mac OS X также поддерживает объемы UFS, которые являются чувствительными к регистру так же, как на любом Unix. См. Раздел 1.8.4, "SQL MySQL Extensions to Standard". lower_case_table_names системная переменная также влияет, как сервер обрабатывает чувствительность к регистру идентификатора, как описано позже в этом разделе.

Отметить

Хотя база данных, таблица, и триггерные имена не являются чувствительными к регистру на некоторых платформах, недопустимо обратиться к одному из этих использующих различных случаев в пределах того же самого оператора. Следующий оператор не работал бы, потому что он отсылает к таблице обоих как my_table и как MY_TABLE:

mysql> SELECT * FROM my_table WHERE
            MY_TABLE.col=1;

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

Однако, имена групп файла журнала являются чувствительными к регистру. Это отличается от стандартного SQL.

По умолчанию табличные псевдонимы являются чувствительными к регистру на Unix, но не так на Windows или Mac OS X. Следующий оператор не работал бы над 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. На Mac OS X значение по умолчанию 2.

Значение Значение
0 Имена таблиц и имена базы данных сохранены на диске, используя lettercase, определенный в CREATE TABLE или CREATE DATABASE оператор. Сравнения имени являются чувствительными к регистру. Недопустимо установить эту переменную в 0, если Вы выполняете MySQL на системе, у которой есть нечувствительные к регистру имена файлов (такие как Windows или Mac OS X). Если Вы вызываете эту переменную к 0 с --lower-case-table-names=0 на нечувствительной к регистру файловой системе и доступе MyISAM имена таблиц используя различный lettercases, индексируйте повреждение, может закончиться.
1 Имена таблиц сохранены в нижнем регистре на диске и называют сравнения, не являются чувствительными к регистру. MySQL преобразовывает все имена таблиц в нижний регистр на хранении и поиске. Это поведение также применяется к табличные псевдонимы и имена базы данных.
2 Имена таблиц и имена базы данных сохранены на диске, используя lettercase, определенный в CREATE TABLE или CREATE DATABASE оператор, но MySQL преобразовывает их в нижний регистр на поиске. Сравнения имени не являются чувствительными к регистру. Это работает только над файловыми системами, которые не являются чувствительными к регистру! InnoDB имена таблиц сохранены в нижнем регистре, что касаетсяlower_case_table_names=1.

Если Вы используете MySQL только на одной платформе, Вы не должны обычно изменяться lower_case_table_names переменная от ее значения по умолчанию. Однако, можно встретиться с трудностями, если Вы хотите передать таблицы между платформами, которые отличаются по чувствительности к регистру файловой системы. Например, на Unix, у Вас может быть две различных названные таблицы my_table и MY_TABLE, но на Windows эти два имени считают идентичными. Чтобы избежать проблем передачи данных, являющихся результатом lettercase имен базы данных или имен таблиц, у Вас есть две опции:

Если Вы планируете установить 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.sqlmysqldump --databases db2 > db2.sql...

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

  2. Использовать DROP DATABASE отбрасывать каждую базу данных.

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

  4. Перезагрузите файл дампа для каждой базы данных. Поскольку lower_case_table_names устанавливается, каждое имя базы данных и имя таблицы будут преобразованы в нижний регистр, поскольку это воссоздается:

    mysql < db1.sqlmysql < db2.sql...

Имена объектов можно считать копиями, если их формы верхнего регистра равны согласно двоичному сопоставлению. Это - истина для имен курсоров, условий, процедур, функций, точек сохранения, сохраненных стандартных параметров, сохраненных локальных переменных программы, и плагинов. Это не истина для имен столбцов, ограничений, баз данных, разделов, операторы, подготовленные с PREPARE, таблицы, триггеры, пользователи, и определяемые пользователем переменные.

Чувствительность к регистру файловой системы может влиять на поискы в строковых столбцах INFORMATION_SCHEMA таблицы. Для получения дополнительной информации см. Раздел 10.1.7.9, "Сопоставление и INFORMATION_SCHEMA Поискы".