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+)
  • 复杂业务场景、需要高效查询:用关联表(符合关系型数据库设计规范)
MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道