PDO не может сравнивать mysql ENUM с использованием целых чисел в подготовленных выражениях - PullRequest
1 голос
/ 02 сентября 2010

Я использую PDO и подготовленные операторы, но я не могу получить никаких результатов, когда сравнивает поле ENUM с целым числом .

Пример:

$db = new PDO('mysql:host=localhost;dbname=****', '***', '***');
$s = $db->prepare('SELECT id FROM t2 WHERE lang = ?');

$s->execute(array('en')); // Works              
print_r($s->fetchAll());

$s->execute(array(2)); // Does not work            
print_r($s->fetchAll());

Я тестирую по этой таблице:

DROP TABLE IF EXISTS t2;
CREATE TABLE t2 (
  id int(10) NOT NULL AUTO_INCREMENT,
  lang enum('no','en','fr') NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
INSERT INTO  t2 (id, lang) VALUES (NULL , 'en');

Есть идеи, как заставить это работать?

IЯ преобразую в PDO, и я предпочел бы не переписывать все константы, перечисления и запросы в моем приложении: (

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

2 не является допустимым элементом ENUM.Это так просто.

Причина, по которой он работает в сыром MySQL, когда вы делаете lang = 2, заключается в том, что он предоставляет базовый механизм хранения для списка (в основном это просто нормализованное значение, но нормализация скрытаот вас в колонке ENUM).

Я бы предложил не пытаться сделать это.MySQL скрывает реализацию по причине.Поймите, что использование 2 для сравнения - не более чем магическое число ...

1 голос
/ 02 сентября 2010

язык не должен быть перечислением, в действительности вообще не использовать перечисления , вместо этого используйте отдельные таблицы поиска / типа:

create table languages
(
  lang_id tinyint unsigned not null auto_increment primary key,
  name varchar(255) unique not null
)
engine=innodb;

create table customers
(
  cust_id int unsigned not null auto_increment primary key,
  lang_id tinyint unsigned not null,
  foreign key (lang_id) references languages(lang_id)
)
engine=innodb;

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

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