插件窝 干货文章 mysql 可以存储数组吗

mysql 可以存储数组吗

数组 JSON 类型 order 454    来源:    2025-03-29

MySQL 数组存储方案

MySQL 本身没有原生的数组数据类型,但有几种方法可以实现类似数组的功能:

1. JSON 数据类型 (MySQL 5.7+ 推荐)

CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    tags JSON  -- 存储数组
);

-- 插入包含数组的JSON
INSERT INTO products VALUES (1, 'Laptop', '["electronics", "computers", "sale"]');

-- 查询包含特定元素的数组
SELECT * FROM products WHERE JSON_CONTAINS(tags, '"electronics"');

2. 字符串拼接 (简单但功能有限)

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    hobbies TEXT  -- 用逗号分隔的字符串
);

-- 插入
INSERT INTO users VALUES (1, 'Alice', 'reading,swimming,hiking');

-- 查询 (使用FIND_IN_SET)
SELECT * FROM users WHERE FIND_IN_SET('swimming', hobbies) > 0;

3. 关系表 (规范化设计)

-- 主表
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_name VARCHAR(100)
);

-- 数组项表
CREATE TABLE order_items (
    item_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    item_name VARCHAR(100),
    FOREIGN KEY (order_id) REFERENCES orders(order_id)
);

-- 查询某个订单的所有项目
SELECT * FROM order_items WHERE order_id = 123;

4. SET 数据类型 (有限制的数组)

CREATE TABLE articles (
    id INT PRIMARY KEY,
    title VARCHAR(100),
    categories SET('news', 'sports', 'entertainment', 'technology')
);

-- 插入
INSERT INTO articles VALUES (1, 'Latest Tech', 'technology,news');

选择建议

  • 现代MySQL(5.7+): 首选JSON类型,功能强大且灵活
  • 需要严格关系: 使用规范化设计(关系表)
  • 简单需求: 字符串拼接或SET类型
  • 复杂查询: JSON或关系表

JSON类型提供了最接近数组的功能,包括数组操作函数如JSON_ARRAY_APPEND, JSON_ARRAY_INSERT等。