Search the MySQL manual:
Subscribe to the monthly
MySQL Newsletter!

6.1.3 Чувствительность имен к регистру

В MySQL имена баз данных и таблиц соответствуют директориям и файлам внутри директорий. Следовательно, чувствительность к регистру операционной системы, под которой работает MySQL, определяет чувствительность к регистру имен баз данных и таблиц. Это означает, что имена баз данных и таблиц нечувствительны к регистру под Windows, а под большинством версий Unix проявляют чувствительность к регистру. Одно большое исключение здесь это Mac OS X, когда файловая система по умолчанию HFS+ используется. Однако Mac OS X также поддерживает тома UFS, которые чувствительны к регистру под Mac OS X также как и на Unix. See section 1.9.3 Расширения MySQL к ANSI SQL92.

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

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

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

Псевдонимы таблиц обладают чувствительностью к регистру. Приведенный ниже запрос не будет выполнен, поскольку он ссылается на псевдоним и как на a, и как на A:

mysql> SELECT col_name FROM tbl_name AS a
    -> WHERE a.col_name = 1 OR A.col_name = 2;

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

Одним из путей устранения этой проблемы является запуск демона mysqld с параметром -O lower_case_table_names=1. По умолчанию этот параметр имеет значение 1 для Windows и 0 для Unix.

Если значение параметра lower_case_table_names равно 1, MySQL при сохранении и поиске будет преобразовывать все имена таблиц к нижнему регистру. С версии 4.0.2 это также касается и имен баз данных. Обратите внимание на то, что при изменении этого параметра перед запуском mysqld необходимо прежде всего преобразовать имена всех старых таблиц к нижнему регистру.

При переносе MyISAM-файлов с Windows на диск в Unix в некоторых случаях будет полезна утилита mysql_fix_extensions для приведения в соответствие регистров расширений файлов в каждой указанной директории базы данных (нижний регистр `.frm', верхний регистр `.MYI' и `.MYD'). Утилиту mysql_fix_extensions можно найти в подкаталоге `scripts'.

User Comments

Posted by Max Matson on December 16 2003 5:04pm[Delete] [Edit]

Warning - Can be the source of data inconsistencies.

Be very careful with this option. I have had a difficult time migrating from 3.23.x on Mac OSX to 4.0.x do to this option being turned on by default. After restoring from a mysqldump bakup, I would get inconsistent results. Since none of my loading batch scripts or processing scripts changed (all used our standard naming convention with upper case in table names), the inconsistency must have come from a change in 3.23.x to 4.0.x . A simple change of this flag to '0' fixed the problem, but only after hours of verifying our data and backups.

Additional - after restoring from our mysqldump files (produced from 3.23.x) to the fresh installation of 4.0.x- mysqlcheck reports several tables as being corrupt. Restoring the same dump file to a backup 3.23.x server produced no such corruption. Resetting this option in 4.0.x to allow mixed case table names and then restoring from the dump also produced no corruption.

The data inconsistencies were apparent in different ways. Column values would change from a simple floating point to huge integers. sql statements would return incorrect values (especially in aggregation functions).

Other than that 4.0.x is quite nice!

Posted by Bruce Altner on February 19 2004 2:53am[Delete] [Edit]

I had this variable set to 0 because we often exchange dump files between Windows and Unix platforms, as a multi-developer team. This worked fine for many years until we upgraded from 3.23 to 4.0.18 (in order to use the UNION feature). I immediately encountered a problem in which query result sets accumulated with each execution. For details see my bug report (#2858) on http://bugs.mysql.com/bug.php?id=2858, which was traced back to this setting in my ini file (my.ini). Setting lower_case_table_names=1 fixed it but setting it to 2 caused the problem to reappear. However, I do not want the behavior defined for a setting of 1, I want the behavior defined by the value of 0. Hopefully they will fix this in a subsequent release.

Add your own comment.