2010-03-10 27 views
0

我試圖將json編碼的數組存儲到MySQL字段中。該存儲陣列的形式是:存儲在MySQL中的數組不被識別爲值

['value1', 'value2', 'value3']

然後我嘗試運行一個查詢,如:

SELECT * FROM mytable WHERE arrayfield

它不返回任何結果。該數組字段爲空或包含數組,所以我試圖獲取只包含該字段中的數組的記錄。

回答

1

使用SQL查詢插入/更新時是否正確地轉義了數據(請參閱mysql_real_escape_stringsprintf)? magic quotes是關閉的嗎?

機器指出,這是相當糟糕的設計,因爲關係數據庫不意味着這種東西......

而且測試這些查詢:

SELECT * FROM mytable WHERE arrayfield != '' 

SELECT * FROM mytable WHERE arrayfield IS NOT NULL 

它們都返回空結果嗎?如果是,請檢查您的INSERT/UPDATE查詢是否正在工作...

2

嘗試

SELECT * FROM mytable WHERE arrayfield != '' 

這是否產生任何結果?

4

您不應將數組或任何類型的對象存儲在關係數據庫中。關係數據庫(位於first normal form)應僅由具有基本數據類型的字段組成。那就是INT,CHAR,VARCHAR,DECIMAL等。另外,它應該不包含重複組,並且列應該沒有內在排序。數組,根據其定義,違反了這一點。如果您覺得需要存儲其他值,那麼您誤解了關係數據庫的概念。

如果你想存儲的對象,如數組等,那麼你應該嘗試被用於這種用途產生了一些數據庫系統,即Object Databases

存儲陣列的最好辦法是使一個附加表該數組,並將數組的每個值放在其自己的行中,然後在父表中存儲某種數組標識符。

例子:

CREATE TABLE People (
    ssn INT, 
    first_name VARCHAR(15) NOT NULL, 
    last_name VARCHAR(20) NOT NULL, 
    PRIMARY KEY (ssn) 
); 

CREATE TABLE Emails (
    belongs_to INT, 
    email VARCHAR(128), 
    PRIMARY KEY (belongs_to, email), 
    UNIQUE(email), 
    CONSTRAINT fk_belongs_to_ssn FOREIGN KEY (belongs_to) REFERENCES People (ssn) 
); 

在這種模式中,每個人都可以擁有多個電子郵件。每個電子郵件都屬於People表中的人員。通過在ssn = belongs_to上加入電子郵件人員,可以爲一個人找到一組電子郵件。通過在電子郵件欄中搜索特定的值和/或模式,可以輕鬆找到單個電子郵件。

+0

但是,這不就是序列化數組的點嗎?我正在用json_encode做什麼? – ssergei 2010-03-10 21:45:30

+0

想象一下,您想要找到每個包含「value2」數組的recods。如何使用單個SQL查詢輕鬆完成此操作?這是爲什麼在關係數據庫中存儲對象是「不好」的原因之一。 – AlexV 2010-03-10 21:58:29

+0

'SELECT * FROM mytable WHERE arrayfield ILIKE'%value2%';'你說得對 - 這不是一個很好的解決問題的方法。 – thetaiko 2010-03-10 22:01:14