在 MySQL 中存储和检索数组
由于关系数据规范化问题,不建议在单个 MySQL 字段中存储数组。但是,如果需要将数组保存在单个字段中,可以使用serialize() 和 unserialize() 函数。
要将数组 ($a) 保存到 MySQL 字段中,请使用以下命令将其转换为字符串serialize():
$a_serialized = serialize($a); // $a_serialized: 'a:2:{i:1;a:3:{s:1:"a";i:1;s:1:"b";i:2;s:1:"c";i:3;}i:2;a:3:{s:1:"a";i:1;s:1:"b";i:2;s:1:"c";i:3;}}'
然后,将序列化值插入数据库。
要从数据库检索数组,请查询字段并使用 unserialize() 将存储的字符串转换回数组:
$query = "SELECT my_array_field FROM my_table"; $result = mysql_query($query); $row = mysql_fetch_assoc($result); $a = unserialize($row['my_array_field']);
或者,json_encode() 和 json_decode() 可分别用于对 JSON 格式的数组进行编码和解码。
替代方法:关系数据库设计
不要将数组存储在单个字段中,而是考虑重构数据库架构以将数组元素表示为相关表中的单独记录。这允许正确的关系建模和高效的查询。
例如,考虑数组:
$a = [ 1 => [ 'a' => 1, 'b' => 2, 'c' => 3 ], 2 => [ 'a' => 1, 'b' => 2, 'c' => 3 ], ];
您可以为数组键和值创建单独的表:
CREATE TABLE keys ( id INT UNSIGNED NOT NULL, a INT UNSIGNED NOT NULL, b INT UNSIGNED NOT NULL, c INT UNSIGNED NOT NULL, PRIMARY KEY (id) ); CREATE TABLE values ( id INT UNSIGNED NOT NULL, value INT UNSIGNED NOT NULL, key_id INT UNSIGNED NOT NULL, PRIMARY KEY (id), FOREIGN KEY (key_id) REFERENCES keys(id) );
然后,将数组元素插入到各自的表中:
INSERT INTO keys (id, a, b, c) VALUES (1, 1,2,3); INSERT INTO values (id, value, key_id) VALUES (1, 1, 1); INSERT INTO values (id, value, key_id) VALUES (2, 2, 1); INSERT INTO values (id, value, key_id) VALUES (3, 3, 1); INSERT INTO keys (id, a, b, c) VALUES (2, 1,2,3); INSERT INTO values (id, value, key_id) VALUES (4, 1, 2); INSERT INTO values (id, value, key_id) VALUES (5, 2, 2); INSERT INTO values (id, value, key_id) VALUES (6, 3, 2);
这种方法可以实现高效的查询和在关系数据库中操作数组数据。
以上是如何在MySQL中高效地存储和检索数组?的详细内容。更多信息请关注PHP中文网其他相关文章!