mysql 存数组,可以通过以下几种方式存储数组数据

首页 2025-09-26 13:33:44


MySQL 本身并不直接支持数组类型,但可以通过以下几种方式存储数组数据:

1. 使用字符串存储(最常用)

将数组元素用特定分隔符(如逗号、竖线)拼接成字符串存储,适合简单数组。
sql
-- 创建表时使用 VARCHAR 或 TEXT 类型
CREATE TABLE example (
  id INT PRIMARY KEY AUTO_INCREMENT,
  tags VARCHAR(255) -- 存储用逗号分隔的数组,如 "php,mysql,java"
);

-- 插入数组数据
INSERT INTO example (tags) VALUES ('php,mysql,java');

-- 查询时拆分数组(使用 FIND_IN_SET 判断元素是否存在)
SELECT * FROM example WHERE FIND_IN_SET('mysql', tags) > 0;

-- 查询时拆分显示(MySQL 8.0+ 支持 JSON_TABLE)
SELECT id, tag 
FROM example,
JSON_TABLE(
  CONCAT('["', REPLACE(tags, ',', '","'), '"]'),
  '$[*]' COLUMNS(tag VARCHAR(50) PATH '$')
) AS jt;
 

2. 使用 JSON 类型(MySQL 5.7+ 推荐)

MySQL 5.7 及以上支持 JSON 类型,可以直接存储数组格式。
sql
-- 创建含 JSON 字段的表
CREATE TABLE example (
  id INT PRIMARY KEY AUTO_INCREMENT,
  data JSON -- 可存储数组
);

-- 插入数组数据
INSERT INTO example (data) VALUES ('["php", "mysql", "java"]');

-- 查询数组
SELECT data FROM example;

-- 查询数组中的元素(获取第一个元素)
SELECT JSON_EXTRACT(data, '$[0]') AS first_element FROM example;

-- 条件查询(判断数组是否包含指定元素)
SELECT * FROM example WHERE JSON_CONTAINS(data, '"mysql"');

-- 追加元素到数组
UPDATE example SET data = JSON_ARRAY_APPEND(data, '$', 'python') WHERE id = 1;
 

3. 使用关联表(最规范的关系型数据库方式)

对于复杂数组或需要频繁查询、更新元素的场景,建议使用关联表拆分存储。
sql
-- 主表
CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255)
);

-- 数组元素关联表(存储标签数组)
CREATE TABLE post_tags (
  post_id INT,
  tag VARCHAR(50),
  FOREIGN KEY (post_id) REFERENCES posts(id)
);

-- 插入数据(相当于给 id=1 的文章添加三个标签)
INSERT INTO posts (title) VALUES ('MySQL 教程');
INSERT INTO post_tags (post_id, tag) VALUES (1, 'php'), (1, 'mysql'), (1, 'java');

-- 查询某篇文章的所有标签
SELECT tag FROM post_tags WHERE post_id = 1;

-- 查询包含 mysql 标签的文章
SELECT p.* FROM posts p
JOIN post_tags t ON p.id = t.post_id
WHERE t.tag = 'mysql';
 

选择建议:

  • 简单场景且不常查询元素:用字符串存储
  • 需要频繁操作数组元素:用 JSON 类型(MySQL 5.7+)
  • 复杂业务场景、需要高效查询:用关联表(符合关系型数据库设计规范)
nat123映射怎么用?超详细步骤,外网访问内网轻松搞定
nat123域名怎么用?两种方式轻松搞定
nat123怎么用?简单几步实现内网穿透
内网穿透工具对比:nat123、花生壳与轻量新选择
远程访问内网很简单:用对工具,一“箭”穿透
ngrok下载完全指南:从入门到获取客户端
内网远程桌面软件:穿透局域网边界的数字窗口
从外网远程访问内网服务器的完整方案
Windows Server 2008端口转发完全教程:netsh命令添加/查看/删除/重置
为什么三层交换机转发比Linux服务器快?转发表硬件加速的秘密