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) - всегда использовать имена таблиц в нижнем регистре, чтобы вам не приходилось об этом беспокоиться; Вы также должны использовать строчные имена столбцов для согласованности.