我正在尝试将json编码的数组存储到MySQL字段中。存储的数组采用以下形式:
['value1', 'value2', 'value3']
然后我尝试运行如下的查询:
SELECT * FROM mytable WHERE arrayfield
它不会返回任何结果。 arrayfield是空白的或包含一个数组,所以我试图获取只包含该字段中的数组的记录。
答案 0 :(得分: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上加入People with Emails,可以为一个人找到一组电子邮件。通过在电子邮件列中搜索特定值和/或模式,可以轻松找到单个电子邮件。
答案 1 :(得分:2)
尝试
SELECT * FROM mytable WHERE arrayfield != ''
这会产生任何结果吗?
答案 2 :(得分:1)
使用SQL查询插入/更新时是否正确转义了数据(请参阅mysql_real_escape_string和sprintf)? magic quotes关闭了吗?
正如Machine所指出的那样,这是一个糟糕的设计,因为关系数据库不适用于那种东西......
同时测试这些查询:
SELECT * FROM mytable WHERE arrayfield != ''
或
SELECT * FROM mytable WHERE arrayfield IS NOT NULL
他们都返回空结果吗?如果是这样,请检查您的INSERT / UPDATE查询是否正常...