MySQL saklanan bir dizi bir değer olarak kabul edilmez

3 Cevap php

Ben MySQL alana bir json kodlanmış dizisini saklamak için çalışıyorum. Depolanan dizi formdadır:

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

Sonra denemek ve bir sorgu gibi çalıştırın:

SELECT * FROM mytable WHERE arrayfield

bu sonucu verir. Arrayfield boş ya veya bir dizi içerir, bu yüzden sadece bu alanda bir dizi içeren kayıtları almak için çalışıyorum.

3 Cevap

(mysql_real_escape_string görmek ve sprintf) SQL sveyagusu ile güncellenmesi / eklerken düzgün veri kaçtı mı? magic quotes KAPALI mısınız?

Makine belirttiği gibi ilişkisel veritabanları bu tür şeyler için bir anlamı olmadığı için bu oldukça kötü bir tasarım ...

Ayrıca bu sveyagulamaları test:

SELECT * FROM mytable WHERE arrayfield != ''

veya

SELECT * FROM mytable WHERE arrayfield IS NOT NULL

do they both return empty results? If so, check that your INSERT/UPDATE query are wveyaking...

Bir ilişkisel veritabanı, diziler, ya da herhangi bir nesne saklamak gerekir. İlişkisel veritabanı, first normal form, temel veri türleri ile alanların sadece oluşmalıdır olmak. Bu INT, CHAR, VARCHAR, DECIMAL vs Ayrıca, hiç yinelenen grupları içermelidir ve sütunu olmalıdır içsel sipariş. Diziler, onların çok tanımı gereği, bu ihlal. Diğer değerlerini depolamak için ihtiyacı hissediyorum, bir ilişkisel veritabanı kavramını yanlış var.

Eğer vb diziler gibi nesneleri saklamak istiyorsanız, o zaman bu tür kullanım için oluşturulan bazı veritabanı sistemi denemelisiniz, yani Object Databases

Dizi depolamak için en iyi yolu, dizi için ek bir tablo yapmak, ve kendi satırında dizinin her değerini koymak, sonra ana tabloda dizi tanımlayıcı çeşit saklamaktır.

Örnek:

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

Bu şemada, her kişi birden fazla e-posta olabilir. Her e-posta İnsanlar tabloda bir kişiye aittir. E-postaların bir dizi ssn = belongs_to üzerinde e-postalar ile insanlar katılarak bir kişi bulunabilir. Bir tek e-posta kolayca belirli bir değere ve / veya desen için e-posta sütun arayarak bulunabilir.

Denemek

SELECT * FROM mytable WHERE arrayfield != ''

Herhangi bir sonuç üretir?