MySql – Случайная проблема с таблицами на разных серверах

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

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

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

case-3 : На моем Live-сервере, который является именем 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'. 

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

Если вы используете 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

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

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

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

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

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

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 FROM tbl_name AS a -> WHERE 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:

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

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

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

Используйте DROP DATABASE для сброса каждой базы данных.

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

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

mysql <db1.sql mysql <db2.sql … Имена объектов могут считаться дублирующими, если их формы в верхнем регистре равны в соответствии с двоичной сортировкой. Это верно для имен курсоров, условий, процедур, функций, точек сохранения, хранимых параметров процедуры и хранимых программных локальных переменных. Это неверно для имен имен столбцов, ограничений, баз данных, операторов, подготовленных с помощью PREPARE, таблиц, триггеров, пользователей и пользовательских переменных.