Поиск

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

В MySQL базы данных соответствуют подкаталогам каталога данных. Таблицы внутри базы данных соответствуют, как минимум, одному файлу, находящемуся внутри подкаталога (а возможно, и большему числу файлов, в зависимости от применяемого механизма хранения). Следовательно, зависимость от регистра имен файлов и каталогов базовой операционной системы определяет зависимость от регистра имен баз данных и таблиц. Это означает, что имена баз и таблиц не зависят от регистра в Windows, но зави­сят в большинстве вариантов Unix. Одним заслуживающим упоминания исключением является система Mac OS X, которая основана на Unix, но использует по умолчанию файловую систему (HFS+), имена в которой не зависят от регистра. Однако Mac OS X также поддерживает тома UFS, в которых имена чувствительны к регистру, как в любой системе Unix. См. раздел Стандарты, которым соответствует MySQL
На заметку!
* Несмотря на то что имена баз данных и таблиц нечувствительны к регистру в некоторых плат-
• f формах, вы не должны обращаться к базе данных или таблице, используя различные регистры, в
t. пределах одного запроса. Следующий запрос не будет работать, потому что обращается к таб-
й лице и каккту_1:аЫе, и каккМУ_ТАВЬЕ:
§ mysql SELECT * FROM my_table WHERE MYJTABLE.col=l;
Имена столбцов, индексов и псевдонимы столбцов не зависят от регистра в любой платформе.
Псевдонимы таблиц были чувствительны к регистру до версии MySQL 4.1.1. Следую­щий запрос не будет работать, поскольку обращается к псевдониму и как к а, и как к а:
mysql SELECT имя_столбца FROM имя_таблицы AS a
- WHERE a.имя_столбца = 1 OR к.имя_столбца = 2;
Если у вас возникают сложности с запоминанием допустимых регистров для имен баз данных и таблиц, примите непротиворечивое соглашение, например, всегда созда­вать базы данных и таблицы с именами в нижнем регистре.

Как имена таблиц сохраняются на диске и используются MySQL - определено сис­темной переменной lower_case_table_names, которую можно установить во время за­пуска raysqld.
lower_case_table_names может принимать одно из следующих значений:

Значение Смысл
  1. Имена баз данных и таблиц сохраняются на диске, используя регистр, указанный
    в операторе CREATE TABLE или CREATE DATABASE. При сравнении имен регистр
    учитывается. Это значение по умолчанию для систем Unix. Следует отметить,
    что в случае установки этого значения равным 0 с помощью опции
    -lower_case_table_names=0 в нечувствительной к регистру операционной
    системе, и обращении к именам таблиц MyISAM с использованием разных реги­
    стров символов могут повредиться индексы.
  2. Имена таблиц сохраняются в нижнем регистре и сравнения имен нечувствитель­
    ны крегистру.MySQLпреобразует все имена таблиц к нижнему регистру при
    сохранении и поиске. Это поведение также относится к именам баз данных, на­
    чиная с версии MySQL 4.0.2, и псевдонимам имен таблиц, начиная с версии
    MySQL 4.1.1. Это значение по умолчанию в системах Windows и Mac OS X.
  3. Имена баз данных и таблиц сохраняются на диске, используя регистр, указанный
    в операторе CREATE TABLE или CREATE DATABASE, но MySQL преобразует их к
    нижнему регистру при поиске. Сравнения имен нечувствительны к регистру.
    Следует отметить, что это работает только в файловых системах, имена в кото­
    рых нечувствительны к регистру. Имена таблиц InnoDB сохраняются в нижнем
    регистре, как при lower_case_table_names=l.

Установка lower_case_table_names равным 2 возможна, начиная с версии
MySQL 4.0.18.


Если вы эксплуатируете MySQL только на одной платформе, обычно вам незачем изменять значение переменной lower_case_table_names. Однако вы можете столкнуться с трудностями при переносе таблицы между платформами, которые по-разному относят­ся к регистру символов в именах. Например, в Unix вы можете иметь две разные табли­цы с именами my_table и my_table, тогда как в Windows эти имена рассматриваются как одно и то же. Чтобы избежать проблем переноса, вызванных регистром символов имен таблиц, существует два выбора:
а Использовать lower_case_table_names=l во всех системах. Главное неудобство, связанное с этим, состоит в том, что когда вы используете SHOW TABLES или SHOW DATABASES, то не увидите имена в их истинном регистре.
  • Использовать Iower_case_table_names=0 в системах Unix и Iower_case_table_names=2 в системах Windows. Это предохранит регистр символов в именах баз и таблиц. Неудобство такого решения связано с необходимостью гарантирования, что за­просы в Windows всегда обращаются к таблицам в правильном регистре. Если вы переносите запросы в среду Unix, где регистр имеет значение, они не будут рабо­тать, если регистр символов не тот.

Следует отметить, что перед установкой lower_case_table_names равным 1 в Unix вы должны сначала преобразовать старые имена баз и таблиц к нижнему регистру перед перезапуском mysqld.