存储在MySQL中的数组不会被识别为值

时间:2010-03-10 20:57:06

标签: php mysql

我正在尝试将json编码的数组存储到MySQL字段中。存储的数组采用以下形式:

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

然后我尝试运行如下的查询:

SELECT * FROM mytable WHERE arrayfield

它不会返回任何结果。 arrayfield是空白的或包含一个数组,所以我试图获取只包含该字段中的数组的记录。

3 个答案:

答案 0 :(得分:4)

您不应将数组或任何类型的对象存储在关系数据库中。位于first normal form中的关系数据库应仅包含具有基本数据类型的字段。这是INTCHARVARCHARDECIMAL等。此外,它不应包含重复的组,并且列应该没有内部排序。根据它们的定义,数组违反了这一点。如果您觉得需要存储其他值,则会误解关系数据库的概念。

如果你想存储对象,比如数组等,那么你应该尝试为这种用途创建的一些数据库系统,即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_stringsprintf)? magic quotes关闭了吗?

正如Machine所指出的那样,这是一个糟糕的设计,因为关系数据库不适用于那种东西......

同时测试这些查询:

SELECT * FROM mytable WHERE arrayfield != ''

SELECT * FROM mytable WHERE arrayfield IS NOT NULL

他们都返回空结果吗?如果是这样,请检查您的INSERT / UPDATE查询是否正常...