我試圖將json編碼的數組存儲到MySQL字段中。該存儲陣列的形式是:存儲在MySQL中的數組不被識別爲值
['value1', 'value2', 'value3']
然後我嘗試運行一個查詢,如:
SELECT * FROM mytable WHERE arrayfield
它不返回任何結果。該數組字段爲空或包含數組,所以我試圖獲取只包含該字段中的數組的記錄。
我試圖將json編碼的數組存儲到MySQL字段中。該存儲陣列的形式是:存儲在MySQL中的數組不被識別爲值
['value1', 'value2', 'value3']
然後我嘗試運行一個查詢,如:
SELECT * FROM mytable WHERE arrayfield
它不返回任何結果。該數組字段爲空或包含數組,所以我試圖獲取只包含該字段中的數組的記錄。
使用SQL查詢插入/更新時是否正確地轉義了數據(請參閱mysql_real_escape_string和sprintf)? magic quotes是關閉的嗎?
機器指出,這是相當糟糕的設計,因爲關係數據庫不意味着這種東西......
而且測試這些查詢:
SELECT * FROM mytable WHERE arrayfield != ''
或
SELECT * FROM mytable WHERE arrayfield IS NOT NULL
它們都返回空結果嗎?如果是,請檢查您的INSERT/UPDATE查詢是否正在工作...
嘗試
SELECT * FROM mytable WHERE arrayfield != ''
這是否產生任何結果?
您不應將數組或任何類型的對象存儲在關係數據庫中。關係數據庫(位於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上加入電子郵件人員,可以爲一個人找到一組電子郵件。通過在電子郵件欄中搜索特定的值和/或模式,可以輕鬆找到單個電子郵件。
但是,這不就是序列化數組的點嗎?我正在用json_encode做什麼? – ssergei 2010-03-10 21:45:30
想象一下,您想要找到每個包含「value2」數組的recods。如何使用單個SQL查詢輕鬆完成此操作?這是爲什麼在關係數據庫中存儲對象是「不好」的原因之一。 – AlexV 2010-03-10 21:58:29
'SELECT * FROM mytable WHERE arrayfield ILIKE'%value2%';'你說得對 - 這不是一個很好的解決問題的方法。 – thetaiko 2010-03-10 22:01:14