Lưu trữ mảng trong MySQL có tốt không?

Chào mừng bạn đến với hướng dẫn về cách lưu trữ và truy xuất mảng vào cơ sở dữ liệu bằng PHP và MySQL. Vì vậy, bạn có một mảng trong PHP và muốn lưu trữ nó trong cơ sở dữ liệu? . MySQL chỉ nhận các chuỗi phẳng, số và dấu thời gian. Nó không chấp nhận mảng hoặc đối tượng

Để lưu trữ một mảng trong cơ sở dữ liệu, có 2 lựa chọn thay thế khả thi

  • Chuyển đổi và lưu trữ mảng dưới dạng chuỗi phẳng, sử dụng json_encode(), serialize() hoặc implode()
  • Tạo một bảng riêng để lưu trữ từng mảng mục một

Nhưng làm thế nào để mỗi công việc?

ⓘ Tôi đã bao gồm một tệp zip chứa tất cả mã khi bắt đầu hướng dẫn này, vì vậy bạn không cần phải sao chép-dán mọi thứ… Hoặc nếu bạn chỉ muốn đi sâu vào

 

 

TLDR – TRANG TRÌNH BÀY NHANH

Tải xuống & Ghi chú

 

TẢI XUỐNG & LƯU Ý

Đầu tiên, đây là liên kết tải xuống mã ví dụ như đã hứa

 

GHI CHÚ NHANH

  • Mở
    CREATE TABLE `people` (
      `id` bigint(20) NOT NULL,
      `name` varchar(255) NOT NULL,
      `colors` text NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
     
    ALTER TABLE `people`
      ADD PRIMARY KEY (`id`),
      ADD UNIQUE KEY `name` (`name`);
     
    ALTER TABLE `people`
      MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
    0, thay đổi cài đặt cơ sở dữ liệu của riêng bạn
  • Có hai bộ ví dụ
    • Các tệp bắt đầu bằng
      CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      1 trình bày cách chuyển đổi một mảng thành một chuỗi và lưu trữ nó trong cơ sở dữ liệu
    • Các tệp bắt đầu bằng
      CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      2 minh họa cách sử dụng bảng "độc lập chuyên dụng"
Nếu bạn phát hiện ra một lỗi, hãy bình luận bên dưới. Tôi cũng cố gắng trả lời các câu hỏi ngắn, nhưng đó là một người so với cả thế giới… Nếu bạn cần câu trả lời gấp, vui lòng xem danh sách các trang web của tôi để được trợ giúp về lập trình

 

MÃ VÍ DỤ TẢI XUỐNG

Nhấp vào đây để tải xuống tất cả các ví dụ, tôi đã phát hành nó theo giấy phép MIT, vì vậy hãy thoải mái xây dựng trên nó hoặc sử dụng nó trong dự án của riêng bạn

 

 

MẢNG TRONG CƠ SỞ DỮ LIỆU

Được rồi, bây giờ chúng ta hãy đi vào các ví dụ về cách lưu trữ các mảng trong cơ sở dữ liệu và truy xuất chúng

 

PHẦN 1) THƯ VIỆN CƠ SỞ DỮ LIỆU PHP

1-cơ sở dữ liệu. php

pdo = new PDO(
      "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=".DB_CHARSET,
      DB_USER, DB_PASSWORD, [
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]);
  }
 
  // (B) DESTRUCTOR - CLOSE DATABASE CONNECTION
  function __destruct () {
    if ($this->stmt!==null) { $this->stmt = null; }
    if ($this->pdo!==null) { $this->pdo = null; }
  }
 
  // (C) HELPER - EXECUTE SQL QUERY
  function exec ($sql, $data=null) {
    $this->stmt = $this->pdo->prepare($sql);
    $this->stmt->execute($data);
  }
 
  // (D) FETCH COLUMN
  function fetch ($sql, $data=null) {
    $this->exec($sql, $data);
    return $this->stmt->fetchColumn();
  }
 
  // (E) FETCH ALL (ON A SINGLE COLUMN)
  function fetchAll ($sql, $data=null) {
    $this->exec($sql, $data);
    return $this->stmt->fetchAll(PDO::FETCH_COLUMN);
  }
}
 
// (F) SETTINGS - CHANGE THESE TO YOUR OWN !
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8mb4");
define("DB_USER", "root");
define("DB_PASSWORD", "");
 
// (G) DATABASE OBJECT
$_DB = new Database();

Hãy để chúng tôi bắt đầu bằng cách tạo một lớp cơ sở dữ liệu, vì vậy chúng tôi không phải lặp lại "kết nối với cơ sở dữ liệu" và "thực thi câu lệnh SQL" trong các ví dụ sau. Nó có thể trông phức tạp, nhưng hãy bình tĩnh và xem xét kỹ

  • (A, B, G) Khi
    CREATE TABLE `people` (
      `id` bigint(20) NOT NULL,
      `name` varchar(255) NOT NULL,
      `colors` text NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
     
    ALTER TABLE `people`
      ADD PRIMARY KEY (`id`),
      ADD UNIQUE KEY `name` (`name`);
     
    ALTER TABLE `people`
      MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
    3 được tạo, hàm tạo sẽ tự động kết nối với cơ sở dữ liệu. Hàm hủy đóng kết nối
  • (C, D, E) Hàm cơ sở dữ liệu
    • CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      4 Hàm trợ giúp để thực hiện một truy vấn SQL
    • CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      5 Tìm nạp một cột dữ liệu –
      CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      6
    • CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      7 Tìm nạp nhiều hàng (trên một cột) –
      CREATE TABLE `people` (
        `id` bigint(20) NOT NULL,
        `name` varchar(255) NOT NULL,
        `colors` text NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
       
      ALTER TABLE `people`
        ADD PRIMARY KEY (`id`),
        ADD UNIQUE KEY `name` (`name`);
       
      ALTER TABLE `people`
        MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
      8
  • (F) Hãy nhớ thay đổi cài đặt thành của riêng bạn

 

 

PHẦN 2) CHUYỂN ĐỔI Mảng THÀNH CHUỖI

2A) BẢNG CƠ SỞ DỮ LIỆU GIẢ

2a-người. sql

CREATE TABLE `people` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL,
  `colors` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
ALTER TABLE `people`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `name` (`name`);
 
ALTER TABLE `people`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;

Trong ví dụ này, chúng tôi sẽ làm việc với một bảng giả lưu trữ mọi người và màu sắc yêu thích của họ

  • CREATE TABLE `people` (
      `id` bigint(20) NOT NULL,
      `name` varchar(255) NOT NULL,
      `colors` text NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
     
    ALTER TABLE `people`
      ADD PRIMARY KEY (`id`),
      ADD UNIQUE KEY `name` (`name`);
     
    ALTER TABLE `people`
      MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
    9 ID cá nhân, khóa chính
  • exec($sql, [1, "Job", $colors]);
     
    // (C) SERIALIZE
    $colors = serialize(["Red", "Blue"]);
    $_DB->exec($sql, [2, "Joe", $colors]);
     
    // (D) IMPLODE
    $colors = implode(",", ["Red", "Green"]);
    $_DB->exec($sql, [3, "Joy", $colors]);
    echo "OK";
    
    0 Tên người
  • exec($sql, [1, "Job", $colors]);
     
    // (C) SERIALIZE
    $colors = serialize(["Red", "Blue"]);
    $_DB->exec($sql, [2, "Joe", $colors]);
     
    // (D) IMPLODE
    $colors = implode(",", ["Red", "Green"]);
    $_DB->exec($sql, [3, "Joy", $colors]);
    echo "OK";
    
    1 Màu sắc yêu thích của họ

 

2B) CHUYỂN ĐỔI THÀNH CHUỖI và LƯU TRỮ TRONG CƠ SỞ DỮ LIỆU

2b-cửa hàng-chuỗi. php

exec($sql, [1, "Job", $colors]);
 
// (C) SERIALIZE
$colors = serialize(["Red", "Blue"]);
$_DB->exec($sql, [2, "Joe", $colors]);
 
// (D) IMPLODE
$colors = implode(",", ["Red", "Green"]);
$_DB->exec($sql, [3, "Joy", $colors]);
echo "OK";

Như trong phần giới thiệu, một cách lưu trữ mảng là biến chúng thành một chuỗi phẳng. Những điều này phải đơn giản, chỉ là câu lệnh SQL

exec($sql, [1, "Job", $colors]);
 
// (C) SERIALIZE
$colors = serialize(["Red", "Blue"]);
$_DB->exec($sql, [2, "Joe", $colors]);
 
// (D) IMPLODE
$colors = implode(",", ["Red", "Green"]);
$_DB->exec($sql, [3, "Joy", $colors]);
echo "OK";
2 thông thường. Nhưng hãy lưu ý 3 phương thức khác nhau mà chúng ta có thể sử dụng để chuyển đổi một mảng thành một chuỗi

  • json_encode() Ký hiệu đối tượng Javascript
  • serialize() Cơ chế PHP mặc định để lưu trữ và biểu diễn mảng, đối tượng, hàm dưới dạng chuỗi
  • implode() Cái này chỉ đơn giản là kết hợp tất cả các phần tử thành một chuỗi phẳng, được phân tách bằng dấu phân cách được chỉ định của bạn

 

 

2C) TRUY XUẤT TỪ CƠ SỞ DỮ LIỆU và CHUYỂN ĐỔI THÀNH Mảng

2c-lấy-chuỗi. php

fetch($sql, [1]));
print_r($colors);
 
// (C) UNSERIALIZE
$colors = unserialize($_DB->fetch($sql, [2]));
print_r($colors);
 
// (D) EXPLODE
$colors = explode(",", $_DB->fetch($sql, [3]));
print_r($colors);;

Đúng, chúng ta chỉ đang thực hiện truy vấn

exec($sql, [1, "Job", $colors]);
 
// (C) SERIALIZE
$colors = serialize(["Red", "Blue"]);
$_DB->exec($sql, [2, "Joe", $colors]);
 
// (D) IMPLODE
$colors = implode(",", ["Red", "Green"]);
$_DB->exec($sql, [3, "Joy", $colors]);
echo "OK";
6 cũ để lấy chuỗi từ cơ sở dữ liệu, sau đó chuyển đổi nó trở lại thành một mảng

  • exec($sql, [1, "Job", $colors]);
     
    // (C) SERIALIZE
    $colors = serialize(["Red", "Blue"]);
    $_DB->exec($sql, [2, "Joe", $colors]);
     
    // (D) IMPLODE
    $colors = implode(",", ["Red", "Green"]);
    $_DB->exec($sql, [3, "Joy", $colors]);
    echo "OK";
    
    7 Để biến một chuỗi JSON trở lại thành một mảng (hoặc đối tượng)
  • exec($sql, [1, "Job", $colors]);
     
    // (C) SERIALIZE
    $colors = serialize(["Red", "Blue"]);
    $_DB->exec($sql, [2, "Joe", $colors]);
     
    // (D) IMPLODE
    $colors = implode(",", ["Red", "Green"]);
    $_DB->exec($sql, [3, "Joy", $colors]);
    echo "OK";
    
    8 Biến một chuỗi được tuần tự hóa trở lại thành một mảng, đối tượng hoặc hàm PHP
  • exec($sql, [1, "Job", $colors]);
     
    // (C) SERIALIZE
    $colors = serialize(["Red", "Blue"]);
    $_DB->exec($sql, [2, "Joe", $colors]);
     
    // (D) IMPLODE
    $colors = implode(",", ["Red", "Green"]);
    $_DB->exec($sql, [3, "Joy", $colors]);
    echo "OK";
    
    9 Ngắt chuỗi thành một mảng, với dấu tách bạn đã chỉ định

 

2D) JSON, IMPLODE, serialize – Cái nào TỐT HƠN?

Tôi khuyên bạn nên sử dụng

fetch($sql, [1]));
print_r($colors);
 
// (C) UNSERIALIZE
$colors = unserialize($_DB->fetch($sql, [2]));
print_r($colors);
 
// (D) EXPLODE
$colors = explode(",", $_DB->fetch($sql, [3]));
print_r($colors);;
0 vì đây là tiêu chuẩn công nghiệp thực tế – JSON được sử dụng trong Javascript, Python, C, C++, C#, Java, v.v… Nó sẽ hoạt động miễn là có trình phân tích cú pháp JSON phù hợp. Nhưng sự thật là, tôi sẽ không bận tâm đến việc mã hóa-giải mã này trong hầu hết thời gian. Xem ví dụ tiếp theo bên dưới

 

 

PHẦN 3) BẢNG RIÊNG

3A) BẢNG MÀU YÊU THÍCH

3a-màu. sql

CREATE TABLE `fav_color` (
  `id` bigint(20) NOT NULL,
  `color` varchar(64) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
ALTER TABLE `fav_color`
  ADD PRIMARY KEY (`id`,`color`);

Sử dụng một chuỗi được mã hóa rất tuyệt, nhưng nó có một số thiếu sót. Trong ví dụ này, chúng tôi tạo một bảng "màu sắc yêu thích độc lập". Dành cho những người bị mất - Mỗi màu sẽ là một mục duy nhất trong bảng này

 

3B) LƯU TRỮ DỮ LIỆU

3b-cửa hàng-riêng biệt. php

 COLORS)
$colors = [
  "1" => ["Red", "Green", "Blue"],
  "2" => ["Red", "Magenta", "Orange", "Yellow"],
  "3" => ["Red", "Blue", "Cyan", "Lime"]
];
 
// (C) SQL INSERT & DATA
$sql = "INSERT INTO `colors` (`id`, `color`) VALUES ";
$data = [];
foreach ($colors as $id=>$col) { foreach ($col as $c) {
  array_push($data, $id, $c);
  $sql .= "(?,?),";
}}
$sql = substr($sql, 0, -1) . ";";
 
// (D) GO!
echo $sql; print_r($data);
$_DB->exec($sql, $data);
echo "OK";

Như bạn thấy, việc lưu trữ dữ liệu bằng giải pháp thứ hai này sẽ tẻ nhạt hơn một chút. Nhưng tất cả những gì chúng ta làm thực ra chỉ là lặp qua mảng màu sắc để tạo từng mục nhập SQL một

 

 

3C) LẤY MẢNG

3c-truy xuất-tách biệt. php

fetchAll($sql, [1]); // JOB
print_r($colors);
$colors = $DB->fetchAll($sql, [2]); // JON
print_r($colors);
$colors = $DB->fetchAll($sql, [3]); // JOY
print_r($colors);

Truy xuất dữ liệu từ cơ sở dữ liệu hoàn toàn không có gì khó khăn

 

3D) BẢNG RIÊNG RIÊNG LÀ CÁCH TỐT HƠN

Tại sao? . Để tìm ra màu nào phổ biến nhất và ít phổ biến nhất

  • Với chuỗi dữ liệu – Trích xuất tất cả các bản ghi, giải mã tất cả các chuỗi, lặp qua các mảng, cộng các màu lại với nhau, sau đó thực hiện sắp xếp mảng
  • Có bàn riêng –
    fetch($sql, [1]));
    print_r($colors);
     
    // (C) UNSERIALIZE
    $colors = unserialize($_DB->fetch($sql, [2]));
    print_r($colors);
     
    // (D) EXPLODE
    $colors = explode(",", $_DB->fetch($sql, [3]));
    print_r($colors);;
    
    1

Chuẩn rồi. Vẻ đẹp của việc tạo một bảng riêng biệt là khả năng phân tích. Vì vậy, hãy luôn cân nhắc ưu và nhược điểm của bạn một cách cẩn thận, sự lười biếng trong việc cắt một vài dòng mã sẽ phải trả giá bằng việc mất khả năng khai thác dữ liệu phù hợp

 

BIT BỔ SUNG & LIÊN KẾT

Đó là tất cả về mã và đây là một số tính năng bổ sung nhỏ có thể hữu ích cho bạn

 

LIÊN KẾT và THAM KHẢO

  • Mã hóa và giải mã JSON – PHP
  • Nổ tung và bùng nổ – PHP
  • Tuần tự hóa và hủy tuần tự hóa – PHP
  • Đối tượng dữ liệu PHP – PHP
  • JSON là gì?

 

HƯỚNG DẪN YOUTUBE

 

BẢNG CHEAT INFOGRAPHIC

Cảm ơn bạn đã đọc, và chúng tôi đã đi đến phần cuối của hướng dẫn này. Tôi hy vọng rằng nó đã giúp giải quyết vấn đề mảng và nếu bạn muốn chia sẻ bất cứ điều gì với hướng dẫn này, vui lòng bình luận bên dưới. Chúc may mắn và mã hóa hạnh phúc

MySQL có thể lưu trữ mảng không?

Câu hỏi. Tôi cho rằng câu trả lời cho câu hỏi này là không - có một lựa chọn tốt hơn ở cả 3 cấp độ để xử lý mảng trong máy chủ cơ sở dữ liệu. MySQL không thực sự có kiểu dữ liệu mảng - thứ gần nhất mà chúng có là kiểu dữ liệu SET, chức năng của nó rất hạn chế.

Tôi có nên sử dụng mảng trong cơ sở dữ liệu không?

Mảng là cấu trúc dữ liệu tạm thời nằm trong bộ nhớ của máy tính. Bảng cơ sở dữ liệu là một cấu trúc cố định, được lưu trữ trên đĩa của máy tính (hoặc máy chủ trong trường hợp ứng dụng web). Bạn không bao giờ thực sự sử dụng mảng "thay vì" cơ sở dữ liệu . Hầu hết thời gian, bạn sẽ sử dụng cả hai cùng nhau.

Chúng ta có thể lưu trữ mảng trong SQL DB không?

Cơ sở dữ liệu SQL truyền thống lưu trữ dữ liệu dưới dạng một giá trị trên mỗi trường. Các cơ sở dữ liệu SQL hiện đại hơn có thể lưu trữ nhiều giá trị được lập chỉ mục của cùng một loại dữ liệu trong một trường duy nhất gọi là mảng .

Cơ sở dữ liệu có thể chứa một mảng không?

Mảng trong Cơ sở dữ liệu mảng tương đương với bảng trong Cơ sở dữ liệu quan hệ và có Ngôn ngữ định nghĩa dữ liệu cụ thể. Đối với các mảng RasDaMan có thể được định nghĩa là một tập hợp, là một hoặc nhiều mảng n chiều hoặc là một kiểu mảng cụ thể, là một mảng n chiều (Hình 2).