Tôi có thể lưu trữ một mảng trong MySQL không?

ảnh hưởng. Máy chủ-7. 1   —   Trạng thái. Bỏ chỉ định


MySQL will implement a data type, ARRAY, to store
variable-sized arrays, in compliance with Standard
SQL (SQL:2003) array functionality.

Rationale
---------
-- Needed functionality:
ARRAY functionality is required by standard SQL.
MySQL 4.1 currently has no ability to support arrays.

-- Compatibility:
Other DBMSs (e.g. Oracle10g) do provide array support.

Syntax
------
Add a new column data type:
 ARRAY [[ may be any data type supported (except
for ARRAY itself, and REF, which MySQL does not support).
It defines the type of data which the array will contain.

-- The [] must be an unsigned integer
greater than zero. It defines the maximum cardinality of
the array, rather than its exact size. Note that the inner
set of brackets are mandatory when defining an array with
a specific size, e.g. INT ARRAY is correct for defining an
array with the default size, INT ARRAY[5] is correct syntax
for defining an array that will contain 5 elements.
   -- As shown in the syntax diagram, []
is optional. If omitted, the maximum cardinality of the
array defaults to an implementation-defined default value.
Oracle's VARRAY size is limited to the maximum number of
columns allowed in a table, so I suggest we make our default
match that maximum. Thus, if [] is omitted,
the maximum cardinality of the array defaults to 1000, which
should also be the absolute maximum cardinality. Thus:
    -- [] defaults to 1000.
    -- [] may range from 1 to 1000.

Function
--------
An array is an ordered collection of elements, possibly
containing data values. The ARRAY data type will be used
to store data arrays in database tables.

Rules
-----
-- An array is an ordered set of elements.

-- The maximum number of elements in the array is known as
the array's maximum cardinality. The maximum cardinality is
defined at the time the array is defined, as is the element
data type.

-- The actual number of elements that contain data values is
known as the array's cardinality. The cardinality of an array
may vary and is not defined at the time the array is defined.
That is, an instance of an array may always contain fewer
elements than the maximum cardinality allows.

-- Each element may contain a data value that corresponds
to the array's defined data type.
   -- Each element has three states: blank (no value assigned
to the element), NULL (NULL assigned to the element), and
containing valid value (data value assigned to the element). 

-- Each element is associated with exactly one ordinal position
in the array. The first array element is found at position 1 (one),
the next at position 2 (two), and so on. Thus, assuming n is the
cardinality of an array, the ordinal position of any array element
is an integer in the range 1 (one) <= element <= n.

-- An array has a maximum cardinality and an actual cardinality.
   -- It is an error if one attempts to assign a value to an array
element whose position is greater than the maximum cardinality of
the array.
   -- It is not an error if one attempts to assign values to only
some of an array's elements.

-- Privileges:
   -- No special privileges are required to create a table
with the ARRAY data type, or to utilize ARRAY data.

-- Comparison:
   -- See WL#2084 Add ability to compare ARRAY data.

-- Assignment:
   -- See WL#2082 Add ARRAY element reference function and
WL#2083 Add ARRAY value constructor function.

Other statements
----------------
-- Two other syntax elements must be implemented in order for
the ARRAY data type to be useful. See WL#2082 for 
Array Element Reference syntax and WL#2083 for Array Constructor
syntax.
-- Also related:
   -- CARDINALITY(). See WL#2085.
   -- Array concatenation. See WL#.

An example
----------
Create a table with the new data type:
CREATE TABLE ArrayTable (array_column INT ARRAY[3]);

Insert data:
INSERT INTO ArrayTable (array_column) 
   VALUES (ARRAY[10,20,30]);

Retrieve data: 
SELECT array_column from ArrayTable 
   WHERE array_column <> ARRAY[];
-- Returns all cases where array_column is not an empty array

Reserved words
--------------
ARRAY, eventually CARDINALITY

Copyright (c) 2000, 2023, Oracle Corporation và/hoặc các chi nhánh của nó. Đã đăng ký Bản quyền

Bài viết này khám phá cách lưu các mảng PHP trong MySQL. MySQL là một hệ thống quản lý cơ sở dữ liệu quan hệ nguồn mở cho phép bạn lưu trữ dữ liệu theo hàng và cột. SQL là viết tắt của Ngôn ngữ truy vấn có cấu trúc để thao tác và truy xuất dữ liệu từ cơ sở dữ liệu SQL. Biết thêm về MySQL

Mục lục

Trước khi bạn đọc

Bài viết yêu cầu bạn kết nối với cơ sở dữ liệu MySQL của bạn bằng PHP, tạo một bảng và kết nối với nó trong PHP. Nếu bạn không quen thuộc với tất cả những điều này, hãy xem xét việc học nó từ w3schools. Ở đây chúng ta chỉ tập trung vào các cách lưu trữ mảng khác nhau trong MySQL PHP

Lưu trữ mảng trong bảng chuẩn hóa

bảng nhân viên

Bạn cần tạo một bảng nhân viên ở cuối nếu bạn đang thử các ví dụ trong bài viết. Để thuận tiện cho bạn, đây là mã tạo bảng SQL dành cho bạn

CREATE TABLE EMPLOYEES_TABLE (
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
salary VARCHAR(30) NOT NULL
)

Lưu trữ mảng PHP trong MySQL dưới dạng hàng mới bằng cách sử dụng hàm nổ với biến

Có điều gì đó không ổn với cách tiếp cận bên dưới. Bạn có thể hình dung về nó?

Hàm implode PHP chuyển đổi một mảng thành một chuỗi. Các giá trị được phân tách bằng dấu phẩy từ hàm nổ đã sẵn sàng để sử dụng trong câu lệnh SQL INSERT INTO. Đây là một ví dụ về việc thêm một hàng vào bảng nhân viên bằng cách sử dụng câu lệnh INSERT

INSERT INTO EMPLOYEES_TABLE (name, salary) VALUES (‘Tom’, ‘60000’);

Mã bên dưới sử dụng hàm nổ và SQL INSERT để thêm nhiều hàng vào EMPLOYEE_TABLE

<?php
include "config.php";
 
$employees_arr =
[
    ["Allen", "60000"],
    ["Anderson", "100000"],
    ["Susi", "120000"]
];
 
$sql = ""; //SQL query string eventually.
foreach($employees_arr as $employee)
{
    $data = implode(",",$employee);
    $sql .= "INSERT INTO EMPLOYEES_TABLE (name, salary)
    VALUES ('".$data.");"; //Builds up multi insert query.
}
 
//Inserts records into the database.
if ($conn->multi_query($sql) === TRUE)
{
    echo "New employees records added successfully.";
}
else
{
    echo "Error: " . $sql . "<br>" . $conn->error;
}
 
 
$conn->close(); //Closes the connection finally.
 
 
//OUTPUT
//New employees records added successfully.

/// SECURITY RISK - DO YOU KNOW WHY?
// WHY SHOULD YOU NOT USE THIS?
?>

Trong đoạn mã này, hàm implode của PHP nhận một mảng employee và biến nó thành một chuỗi được phân tách bằng dấu phẩy. Chuỗi được thêm vào biến $sql. Biến này lưu trữ chuỗi truy vấn, giống như cú pháp SQL mà chúng ta đã thấy ở trên

Sự khác biệt ở đây là mã thực hiện nhiều lần chèn và do đó vòng lặp tiếp tục thêm vào chuỗi truy vấn. Cuối cùng, nó lưu mảng trong MySQL PHP bằng cách sử dụng hướng đối tượng – tìm hiểu thêm về MySQLi Hướng đối tượng tại đây

Rủi ro bảo mật – SQL injection. Không sử dụng

Vâng. Vì vậy, chúng tôi vừa chỉ cho bạn một giải pháp và bạn có thể sẽ bắt gặp giải pháp này trên Stack Overflow hoặc các tài nguyên khác. Đừng sử dụng nó. Nó sẽ mở cơ sở dữ liệu của bạn đến các lỗ hổng

Không bao gồm các biến PHP trực tiếp vào các câu lệnh SQL của bạn. Bạn cần tham số hóa chúng bằng các câu lệnh

Tại sao lại thế này?

Bởi vì biến của bạn có thể đến từ một giá trị không xác định như từ trình duyệt. Điều gì sẽ xảy ra nếu ai đó xấu đặt nó vào hộp văn bản của bạn và nó đã vượt qua xác thực của bạn?

DROP TABLE EMPLOYEES_TABLE;

Không tốt

Đây là lý do tại sao các câu lệnh được tham số hóa tồn tại. Bạn cần viết tuyên bố chung của mình và sau đó liên kết các biến của bạn dưới dạng tham số. Kiểm tra các liên kết và ví dụ dưới đây để tìm hiểu thêm

  • Tìm hiểu về MySQL injection
  • Các câu lệnh được tham số hóa của MySQL

Lưu trữ Mảng trong MySQL dưới dạng hàng mới bằng cách sử dụng vòng lặp foreach và câu lệnh được tham số hóa

Hàm implode rất hữu ích khi có nhiều cột hoặc điểm dữ liệu. Nếu có một vài, thì vòng lặp for sẽ dễ dàng và hiệu quả hơn. Bảng cơ sở dữ liệu mà chúng ta đang xem xét chỉ bao gồm hai cột – tên và lương

Hãy xem cách lưu một mảng bằng vòng lặp for trong PHP

<?php
include "config.php";
 
$employees_arr =
[
    ["Allen", "60000"],
    ["Anderson", "100000"],
    ["Susi", "120000"]
];
 
// prepare and bind
$stmt = $conn->prepare("INSERT INTO EMPLOYEES_TABLE (name, salary) VALUES(?, ?)");   

foreach($employees_arr as $employee)
{
    $name = $employee[0];
    $salary = $employee[1];

    // Let's bind our parameters correctly
    $stmt->bind_param($name, $salary);
    $stmt->execute();
}
 
$conn->close(); //Closes the connection finally.
 
 
//OUTPUT
//New employees records added successfully.
?>

Mã này khá giống nhau ngoại trừ việc nó lấy tên và lương của một nhân viên thông qua lập chỉ mục trực tiếp từ mảng.  

Lưu Analytics & dữ liệu không chuẩn hóa

Vâng. ở trên là tuyệt vời để chuyển đổi một mảng thành các hàng mới, nhưng nếu bạn muốn lưu toàn bộ mảng dưới dạng một chuỗi cho mục đích phân tích vào một cột thì sao?

Sử dụng hàm json_encode để lưu trữ toàn bộ mảng PHP trong MySQL

Lưu nó dưới dạng JSON

JSON nói chung là định dạng ưa thích để lưu trữ các mảng trong các cột MySQL. Dễ dàng chèn, đọc và rút ra khỏi cơ sở dữ liệu. Tất cả các ngôn ngữ hiện đại đều có thể giải thích và trích xuất nó. Ngoài ra, bạn thực sự có thể truy vấn đối tượng JSON kể từ MySQL 8. Đây phải là goto trừ khi bạn có lý do cụ thể để không sử dụng phương pháp này

Kiểm tra ví dụ dưới đây sử dụng json_encode

Hãy tạo một bảng phân tích

CREATE TABLE EMPLOYEE_REVIEWS ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, employee_id INT(6) NOT NULL, details TEXT NOT NULL )

Ổn thỏa. Bây giờ hãy chèn một số dữ liệu

<?php
include "config.php";
 
$employeeID = 1;
$reviews = ["GOOD", "BAD", "GOOD", "POOR", "EXCELLENT", 3, 0];
 
// prepare and bind
$stmt = $conn->prepare("INSERT INTO EMPLOYEE_REVIEWS (employee_id, details) VALUES(?, ?)");
$stmt->bind_param($employeeID, json_encode($reviews));
$stmt->execute();
$stmt->close();

Lưu ý về mã hóa json và lưu trữ toàn bộ mảng

Nội dung trên có thể không thực tế nhưng tôi đã viết nó theo một cách nhất định để chỉ ra trường hợp tiềm năng mà bạn có thể cần lưu trữ các loại dữ liệu khác nhau. Điều này khá phổ biến trong dữ liệu phân tích. Bạn chỉ cần lưu trữ nó và các quy trình ETL dữ liệu của bạn sẽ quản lý nó cho người dùng doanh nghiệp sau này

Bạn có thể truy vấn trực tiếp cột chi tiết bằng MySQL, nhưng nhiều khả năng bạn sẽ sử dụng cơ sở dữ liệu SQL làm kho lưu trữ dữ liệu đơn giản. Điều này là hợp lý để làm với số lượng nhỏ nhưng nó hơi có mùi mã. Một giải pháp thông minh hơn có khả năng lưu trữ các mảng dưới dạng JSON hoặc CSV trong nhóm s3

Lưu mảng trong MySQL PHP bằng serialize

Điều gì sẽ xảy ra nếu bạn không thể sử dụng JSON vì một lý do ngớ ngẩn nào đó?

Bạn có thể sử dụng chức năng tuần tự hóa

Hàm tuần tự hóa trả về một biểu diễn luồng byte của một mảng. Nó không thể đọc được trừ khi bạn gọi unserialize để biến nó trở lại thành một mảng. Sẽ hữu ích nếu bạn chỉ muốn lưu một chuỗi dài trong một cột trong cơ sở dữ liệu

Bây giờ, nó đánh bại mục đích của cơ sở dữ liệu quan hệ vì bạn không thể có nhiều trường và do đó, mối quan hệ giữa các bảng theo đúng nghĩa. Nó chỉ là một cách để lưu trữ một mảng dưới dạng một chuỗi trong cơ sở dữ liệu.  

Đây là cách lưu mảng trong MySQL PHP với chức năng tuần tự hóa

________số 8

Thấy rằng nó không cần vòng lặp nữa, nó tuần tự hóa toàn bộ mảng và lưu chuỗi luồng byte vào một cột dữ liệu duy nhất trong bảng EMPLOYEE_REVIEWS

Gói (lại

Phù. Đó là rất nhiều thứ để tiêu hóa. Bài viết khám phá các cách khác nhau để lưu trữ mảng trong MySQL với PHP. Nó nhìn vào hàm implode và cách nó lưu mảng vào cơ sở dữ liệu. Tiếp theo, nó khám phá phương thức vòng lặp for và cuối cùng là hàm tuần tự hóa để lưu trữ một chuỗi dài trong một cột

Đó là tất cả về nó. Chúng tôi hy vọng bạn thích nó. Hãy theo dõi để biết thêm tại FuelingPHP

Bạn muốn tìm hiểu thêm về PHP?

Chúng tôi có nhiều bài viết thú vị liên quan đến PHP. Bạn có thể khám phá những điều này để tìm hiểu thêm về PHP

  • Tại sao PHP lại mang tiếng xấu vào năm 2022?
  • Làm cách nào để sắp xếp một mảng nhiều chiều theo giá trị?
  • Cách sửa lỗi chuyển đổi mảng thành chuỗi trong PHP

Bài viết liên quan

Tôi có thể lưu trữ một mảng trong MySQL không?
Cách sắp xếp mảng nhiều chiều theo giá trị?
Tôi có thể lưu trữ một mảng trong MySQL không?
Mảng kết hợp hoặc bản đồ băm trong PHP là gì
Tôi có thể lưu trữ một mảng trong MySQL không?
Cách sắp xếp mảng đối tượng theo thuộc tính
Tôi có thể lưu trữ một mảng trong MySQL không?
How to convert array to string with PHP implode function


  • ← Cách xóa một tệp trong PHP nếu nó tồn tại với các ví dụ về mã vào năm 2023
  • Tại sao PHP lại mang tiếng xấu vào năm 2023?

Tôi có thể lưu trữ một mảng trong MySQL không?
báo cáo quảng cáo này

Tôi có thể lưu trữ một mảng trong MySQL không?

Stephen Phép Lạ

Chào. Tôi hy vọng bạn thích bài viết này. Tôi đã phát triển các trang web và phần mềm một cách chuyên nghiệp trong hơn 20 năm. Tôi bắt đầu FuelingPHP như một cách để đền đáp lại cộng đồng nguồn mở đã giúp tôi có thể sống thoải mái khi xây dựng những thứ tôi yêu thích

MySQL có thể giữ mảng không?

MySQL không có kiểu dữ liệu mảng . Đây là một vấn đề cơ bản trong các kiến ​​trúc nơi lưu trữ các hàng không chuẩn hóa là một yêu cầu, ví dụ, trong đó MySQL (cũng) được sử dụng để lưu trữ dữ liệu.

Chúng ta có thể lưu trữ mảng trong cơ sở dữ liệu không?

Mảng là một biến đặc biệt cho phép lưu trữ một hoặc nhiều giá trị trong một biến duy nhất e. g. – giữ tên người dùng hoặc thông tin chi tiết trong Mảng. Chúng dễ thao tác hơn. Đôi khi, yêu cầu lưu trữ Mảng trong cơ sở dữ liệu MySQL và truy xuất nó .

Làm cách nào để sử dụng mảng trong MySQL?

mysql> select *from PassingAnArrayDemo; Sau đây là kết quả. Sau đây là cú pháp để gửi một tham số mảng với sự trợ giúp của mệnh đề IN. mysql> CHỌN * -> TỪ PassingAnArrayDemo trong đó id IN(1,3,6);

Chúng ta có thể lưu trữ mảng trong cơ sở dữ liệu quan hệ không?

Mảng số đa chiều thường được tuần tự hóa thành định dạng nhị phân để lưu trữ và xử lý hiệu quả. Các biểu diễn này có thể được lưu trữ dưới dạng các đối tượng nhị phân trong các hệ thống quản lý cơ sở dữ liệu quan hệ hiện có .