MySql - чувствительный к регистру вопрос таблиц на разных серверах

Я работаю на трех разных серверах, которые являются Unix/ Windows/ Unix.

case-1: На моем сервере loacl, который является unix, у меня есть одно имя таблицы Country_master и ее поля pk_CountryId, CountryName и т. Д.

case-2: На моем демонстрационном сервере имя таблицы окон автоматически изменилось на country_master.

case-3: На моем Живом сервере, который является именем таблицы unix country_master.

Но в названии моей кодовой таблицы указано Country_master, поэтому оно дает мне такую ​​ошибку

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'markets.Country_master' doesn't exist'.

Могу ли я каким-либо образом не изменить имя таблицы в базе данных, а также в коде, но это требует нижнего регистра?

4 ответа

Решение

Если вы используете MySQL, вы можете установить имя таблицы и столбца с учетом регистра в my.conf, используя следующую директиву

set-variable = lower_case_table_names=1

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

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

http://dev.mysql.com/doc/refman/5.6/en/identifier-case-sensitivity.html

http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

9.2.2. Чувствительность к регистру идентификатора В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует как минимум одному файлу в каталоге базы данных (и, возможно, большему количеству, в зависимости от механизма хранения). Следовательно, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру имен баз данных и таблиц. Это означает, что имена баз данных и таблиц не чувствительны к регистру в Windows, и чувствительны к регистру в большинстве разновидностей Unix. Одним заметным исключением является Mac OS X, которая основана на Unix, но использует тип файловой системы по умолчанию (HFS+), который не учитывает регистр. Однако Mac OS X также поддерживает тома UFS, которые чувствительны к регистру, как и в любом Unix. См. Раздел 1.8.4, "Расширения MySQL для стандартного SQL". Системная переменная 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 ОТ tbl_name КАК -> ГДЕ a.col_name = 1 ИЛИ 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 Имена таблиц и баз данных хранятся на диске с использованием буквенного регистра, указанного в операторе CREATE TABLE или CREATE DATABASE. Сравнение имен чувствительно к регистру. Вы не должны устанавливать эту переменную в 0, если вы используете MySQL в системе с именами файлов без учета регистра (например, Windows или Mac OS X). Если вы зададите для этой переменной значение 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:

Переименовать таблицу T1 до t1; Чтобы преобразовать одну или несколько целых баз данных, дамп их перед настройкой lower_case_table_names, затем отбросьте базы данных и перезагрузите их после установки lower_case_table_names:

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

mysqldump --database db1 > db1.sql mysqldump --databases db2 > db2.sql ... Сделайте это для каждой базы данных, которая должна быть воссоздана.

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

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

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

mysql

Из прекрасного руководства:

В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует как минимум одному файлу в каталоге базы данных (и, возможно, большему количеству, в зависимости от механизма хранения). Триггеры также соответствуют файлам. Следовательно, чувствительность к регистру базовой операционной системы играет роль в чувствительности к регистру имен баз данных, таблиц и триггеров.

Таким образом, чувствительность к регистру имен ваших таблиц зависит от базовой файловой системы: они (как правило) будут нечувствительны к регистру в Windows и OSX, но чувствительны к регистру в Linux. Это поведение частично зависит от lower_case_table_names установка:

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

Таким образом, у вас есть различные вещи, которые будут влиять на чувствительность к регистру имен ваших таблиц. Единственное разумное решение (IMO) - всегда использовать имена таблиц в нижнем регистре, чтобы вам не приходилось об этом беспокоиться; Вы также должны использовать строчные имена столбцов для согласованности.

Другие вопросы по тегам