Преобразование таблиц с учетом регистра в MySQL - PullRequest
2 голосов
/ 11 августа 2009

У меня есть PHP кодовая база, которая была написана для адресации наших таблиц MySQL в смешанном регистре. Например, xar_intakeformgenerator_ChangeLog.

Наш код также работает в Windows, и, прежде чем мы узнали что-то лучше, мы импортировали несколько баз данных на сервер Windows. Это привело к тому, что Windows MySQL изменил все имена таблиц на строчные. (xar_intakeformgenerator_changelog). Теперь мы знаем, как предотвратить это в новых базах данных. (Set lower_case_table_names) И, код отлично работает на серверах Windows, потому что MySQL просто не заботится о случае таблиц в Windows.

Вот проблема. Сервер Windows доставляет нам горе, и нам нужно перенести все базы данных на сервер Linux. Поскольку все имена таблиц преобразованы в нижний регистр, код НЕ будет работать в Linux. К счастью, Xaraya создает сопоставления таблиц. Таким образом, теоретически я мог бы создать новую кодовую базу для этих баз данных и изменить сопоставления каждого модуля, чтобы использовать таблицы в нижнем регистре. Или мы могли бы вручную изменить имена таблиц после их импорта на компьютер Linux, чтобы получить правильный регистр таблиц.

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

Я не в восторге от любого варианта. Кто-нибудь знает оригинальный способ справиться с этим?

Ответы [ 3 ]

8 голосов
/ 12 августа 2009

OK. Я нашел свой ответ.

На сервере Linux мне нужно было выполнить следующее, чтобы изменить все имена таблиц в моих сгенерированных базах данных Linux на строчные:

  1. Как создать сценарий SQL, который переименует все таблицы в схеме в строчную форму:

    select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') 
    from information_schema.tables where table_schema = 'your_schema_name';
    
  2. Переименованы базы данных в phpmyadmin в строчные имена.

  3. Изменено my.cnf на сервере Linux для использования lower_case_table_names=1

  4. Перезапущен mysql.

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

1 голос
/ 11 августа 2009

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

Вот что я нашел: Идентификатор чувствительности к регистру

Цитирование этой страницы:

Если вы используете 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 в Окна. Это сохраняет корпус базы данных и имен таблиц.

(есть еще кое-что, что я не копировал и не вставлял; поэтому читать эту страницу было бы неплохо ;-))

Надеюсь, это поможет ...

0 голосов
/ 11 августа 2009

lower_case_table_names

Для Windows по умолчанию «сделать все строчными» (1). Установите значение 2: «Без учета регистра, но сохраняйте регистр без изменений».

Эти изменения попадают в ваш my.cnf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...