Oh MyUtils

JSON转SQL - 生成CREATE TABLE和INSERT语句 在线工具

将JSON数据转换为MySQL、PostgreSQL、SQLite和SQL Server的CREATE TABLE和INSERT语句 — 100%浏览器处理,数据不会发送到服务器。

SQL方言
表名
输出模式
主键
嵌套JSON
标志
JSON输入
SQL输出
 

常见问题

什么是 JSON to SQL 转换器?

JSON to SQL 转换器是一种将 JSON 数据转换为 SQL 语句的工具。它根据 JSON 中的结构和类型生成定义数据库模式的 CREATE TABLE 语句(DDL)和填充表数据的 INSERT INTO 语句(DML)。该工具会自动从 JSON 值推断 SQL 列类型:字符串变为 VARCHAR 或 TEXT,数字变为 INT 或 FLOAT,布尔值根据数据库方言变为 BOOLEAN 或 BIT,嵌套对象存储为 JSON 列。

如何将 JSON 转换为 SQL 语句?

将您的 JSON 数据(单个对象或对象数组)粘贴到输入字段中。选择目标 SQL 方言(MySQL、PostgreSQL、SQLite 或 SQL Server),输入表名,然后选择输出模式(CREATE TABLE + INSERT、仅 CREATE 或仅 INSERT)。该工具会在输出面板中即时生成对应的 SQL。在将结果复制到剪贴板之前,您可以自定义批量 INSERT 模式、主键选择和嵌套 JSON 处理等选项。

类型推断是如何工作的?

该工具分析所有行中每个 JSON 字段的所有值,以确定最佳的 SQL 列类型。字符串根据长度映射为 VARCHAR(255) 或 TEXT,整数根据大小映射为 INT 或 BIGINT,小数映射为 FLOAT,布尔值映射为方言特定的布尔类型(PostgreSQL 为 BOOLEAN,MySQL 为 TINYINT(1),SQL Server 为 BIT),null 值使列可为空。像 '2026-03-20' 这样的 ISO 8601 日期字符串会被检测并映射为 DATE 或 TIMESTAMP 类型。嵌套对象和数组存储为 JSON/JSONB 列。

SQL 方言之间有什么区别?

每种 SQL 方言对标识符、数据类型和功能都有独特的语法。MySQL 使用反引号引用(例如 `column_name`),PostgreSQL 使用双引号,SQLite 使用双引号,SQL Server 使用方括号([column_name])。布尔类型不同:PostgreSQL 有原生 BOOLEAN,MySQL 使用 TINYINT(1),SQL Server 使用 BIT。自增语法也不同:MySQL 使用 AUTO_INCREMENT,PostgreSQL 使用 SERIAL,SQLite 使用 AUTOINCREMENT,SQL Server 使用 IDENTITY(1,1)。JSON 存储也不同:PostgreSQL 有 JSONB,MySQL 有 JSON,而 SQLite 和 SQL Server 使用 TEXT/NVARCHAR(MAX)。

使用此工具时我的数据安全吗?

是的,完全安全。此工具使用客户端 JavaScript 在您的浏览器中处理所有内容。您的 JSON 数据永远不会离开您的计算机——没有服务器上传、没有 API 调用、没有数据存储。这使得它可以安全地用于生产数据库数据、包含敏感信息的 API 响应以及您需要转换为 SQL 的任何机密数据。

该工具如何处理嵌套的 JSON 对象和数组?

该工具为嵌套 JSON 提供两种策略。默认的'JSON 列'策略将嵌套对象和数组作为 JSON/JSONB 列存储在数据库中,保留原始结构。'扁平化'策略通过创建具有外键关系的独立关联表来规范化数据——嵌套对象变为带前缀名称的扁平化列,对象数组创建子表。选择 JSON 列用于快速存储和灵活查询,或选择扁平化用于完全规范化的关系模式设计。

什么是批量 INSERT 模式?

批量 INSERT 模式使用多值语法将多行合并为一个 INSERT 语句:INSERT INTO table VALUES (...), (...), (...)。在导入大型数据集时,这比单独的 INSERT 语句快得多,因为它减少了与数据库的往返次数。您可以配置批量大小(默认:每条语句 100 行)以在语句大小和性能之间取得平衡。所有主流数据库都支持此语法。

代码示例

// JSON to SQL converter
function jsonToSql(jsonStr, options = {}) {
  const {
    tableName = 'my_table',
    dialect = 'mysql',
    includeCreate = true,
    includeInsert = true,
  } = options;

  const data = JSON.parse(jsonStr);
  const rows = Array.isArray(data) ? data : [data];
  if (rows.length === 0) return '';

  // Collect all column names
  const columns = [...new Set(rows.flatMap(Object.keys))];

  // Infer types from all rows
  const types = {};
  for (const col of columns) {
    for (const row of rows) {
      const val = row[col];
      if (val === null || val === undefined) continue;
      if (typeof val === 'boolean') types[col] = 'BOOLEAN';
      else if (typeof val === 'number') {
        types[col] = Number.isInteger(val) ? 'INT' : 'FLOAT';
      } else if (typeof val === 'object') types[col] = 'JSON';
      else types[col] = 'VARCHAR(255)';
    }
    if (!types[col]) types[col] = 'VARCHAR(255)';
  }

  const quote = dialect === 'mysql' ? (n) => `\`${n}\``
    : dialect === 'sqlserver' ? (n) => `[${n}]`
    : (n) => `"${n}"`;

  const parts = [];

  if (includeCreate) {
    const colDefs = columns.map(c => `  ${quote(c)} ${types[c]}`);
    parts.push(`CREATE TABLE ${quote(tableName)} (\n${colDefs.join(',\n')}\n);`);
  }

  if (includeInsert) {
    for (const row of rows) {
      const vals = columns.map(c => {
        const v = row[c];
        if (v === null || v === undefined) return 'NULL';
        if (typeof v === 'boolean') return v ? 'TRUE' : 'FALSE';
        if (typeof v === 'number') return String(v);
        if (typeof v === 'object') return `'${JSON.stringify(v).replace(/'/g, "''")}'`;
        return `'${String(v).replace(/'/g, "''")}'`;
      });
      parts.push(
        `INSERT INTO ${quote(tableName)} (${columns.map(quote).join(', ')}) VALUES (${vals.join(', ')});`
      );
    }
  }

  return parts.join('\n\n');
}

// Example usage
const json = '[{"id":1,"name":"Alice","active":true},{"id":2,"name":"Bob","active":false}]';
console.log(jsonToSql(json, { tableName: 'users', dialect: 'postgresql' }));

相关工具