2010-09-02 58 views
1

我正在使用PDO和準備語句,但我似乎無法得到任何結果時比較ENUM字段與整數PDO無法比較使用整數準備語句中的mysql ENUM

例如:如何得到這個工作

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'); 

任何想法:

$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()); 

我測試對這個表?

我轉換爲PDO,我不希望重寫所有的常量,枚舉和查詢我的應用程序:(

+0

好的。我會挖掘一個大洞,直到所有ENUM被聰明的外鍵取代,我纔會出來。 *嘆息* – Joernsn 2010-09-02 13:16:16

回答

2

2不是一個有效的ENUM元素。就這麼簡單。

當你做lang = 2它在原MySQL的原因,是它暴露出底層存儲機制列表(基本上它只是一個標準值,但標準化是從您的ENUM列HID)。

我建議不要這樣做,MySQL隱瞞實現的原因。Realiz在使用2的比較E無非是magic number更多...

1

語言不應該是一個枚舉,事實上不使用枚舉都轉而使用單獨的查詢/類型表:

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重建整個表 - 對於大型表而言不是最優的!

+0

謝謝! ircmaxell得到了原因,你得到了如何。我愛你們。 – Joernsn 2010-09-02 13:20:21

+0

不客氣:) – 2010-09-02 13:55:29