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'.

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

Ответ 1

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

set-variable = lower_case_table_names=1

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

Ответ 3

Из точное руководство:

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

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

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

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

Ответ 4

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

9.2.2. Чувствительность регистра идентификатора В MySQL базы данных соответствуют каталогам в каталоге данных. Каждая таблица в базе данных соответствует хотя бы одному файлу в каталоге базы данных (и возможно, больше, в зависимости от механизма хранения). Следовательно, чувствительность к регистру базовой операционной системы играет определенную роль в чувствительность к регистру базы данных и таблиц. Это означает, что база данных и имена таблиц в Windows не чувствительны к регистру, а чувствительны к регистру в большинстве разновидностей Unix. Одним из примечательных исключений является Mac OS X, Unix-based, но использует тип файловой системы по умолчанию (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 on Окна. Это сохраняет регистр букв имен баз данных и таблиц. Недостатком этого является то, что вы должны убедиться, что ваши заявления всегда ссылайтесь на свою базу данных и имена таблиц с правильными регистр букв в Windows. Если вы передадите свои заявления в Unix, где регистр букв является значительным, они не работают, если буква неверно.

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

Если вы планируете установить системную переменную lower_case_table_names на 1 на Unix, вы должны сначала преобразовать старые имена и имена таблиц в в нижнем регистре перед тем, как остановить mysqld и перезапустить его с помощью нового переменная. Чтобы сделать это для отдельной таблицы, используйте RENAME Таблица:

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, таблицы, триггеры, пользователи и пользовательские переменные.