MySQL вид заглавных букв имени столбца - PullRequest
6 голосов
/ 19 июля 2011

Я в процессе обновления наших собственных приложений с MySQL 5.0.45 до 5.1.41.В старой среде мы зеркалировали некоторые таблицы, используя символические ссылки с одной БД на другую.По нескольким причинам текущие версии MySQL блокируют это полностью.

То, что казалось лучшей заменой, - это использование вида, но у меня проблема.Несколько старых таблиц имеют имена столбцов с заглавными буквами.Однако некоторые из нашего кода приложения (PHP) выполняют SELECT с заглавными буквами, а также некоторые SELECT с именами столбцов в нижнем регистре.Что обычно работает нормально, потому что MySQL возвращает таблицы с заглавными буквами, как вы указали в SELECT.Тем не менее, с точки зрения, что это не так.См. Следующее:


create table t(A int);
Query OK, 0 rows affected (0.18 sec)

> create view v as select A from t;
Query OK, 0 rows affected (0.00 sec)

> insert into t values(47);
Query OK, 1 row affected (0.01 sec)

> select a from t;
+------+
| a    |
+------+
|   47 |
+------+
1 row in set (0.00 sec)

> select a from v;
+------+
| A    |
+------+
|   47 |
+------+
1 row in set (0.00 sec)

Обратите внимание, что заглавная буква имени столбца, возвращаемого в запросах SELECT, отличается от того, выбираете ли вы из таблицы или представления.Таблица возвращает заглавные буквы, как указано в вашем запросе во время выполнения;представление возвращает заглавные буквы, когда представление было создано.Кажется, это согласуется с обеими версиями MySQL, как с клиентом командной строки, так и с клиентом библиотеки PHP.

Я обнаружил один трюк: если вы добавите GROUP BY в SELECT в представлении, оно будетиспользуйте заглавные буквы в вашем запросе во время выполнения.К сожалению, это нарушает обновление представления, в котором я нуждаюсь.

Есть ли способ сделать так, чтобы заглавные буквы имени столбца соответствовали запросу во время выполнения, что не предполагает возврата назад и изменения всего кода нашего приложения?

Ответы [ 2 ]

0 голосов
/ 29 октября 2011

вместо

    mysql> select a from v;

используйте это (с псевдонимом),

    mysql> select a as a from v;
    +------+
    | a    |
    +------+
    |   47 |
    +------+
    1 row in set (0.00 sec)
0 голосов
/ 02 октября 2011

Я должен сказать, что не уверен на 100%, но я сильно подозреваю, что вы не можете получить совпадающий регистр в своих представлениях без изменения кода приложения.Посмотрите, как определяется представление (я использую MySQL 5.1.56):

mysql> show create view v;
+------+-----------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                           | character_set_client | collation_connection |
+------+-----------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v    | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` AS select `t`.`A` AS `A` from `t` | utf8                 | utf8_general_ci      |
+------+-----------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)

Как видите, MySQL добавляет псевдоним столбца (AS), и AFAIK нет никакого способачтобы заставить его вести себя по-другому.Явное определение имени столбца приводит к тому же результату:

mysql> create view v2 (viewa) as select A from t;
Query OK, 0 rows affected (0.02 sec)

mysql> select Viewa from v2;
+-------+
| viewa |
+-------+
|    47 |
+-------+
1 row in set (0.00 sec)

mysql> show create view v2;
+------+----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View                                                                                                                | character_set_client | collation_connection |
+------+----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| v2   | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `t`.`A` AS `viewa` from `t` | utf8                 | utf8_general_ci      |
+------+----------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.00 sec)

Добавление псевдонима столбца (несколько забавно выглядящего) во все ваши запросы SQL, очевидно, решит проблему:

mysql> select a as a from v;
+------+
| a    |
+------+
|   47 |
+------+
1 row in set (0.00 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...