You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断NodeJS连接的是MySQL还是MariaDB服务器?

解决MySQL与MariaDB JSON类型兼容问题(mysql2连接器)

一、判断数据库类型的方法

连接成功后,通过查询version()函数获取数据库版本信息,即可区分MySQL和MariaDB:

  • MySQL的版本字符串以数字开头(如8.0.36)
  • MariaDB的版本字符串会包含MariaDB关键字(如10.6.16-MariaDB)

用mysql2实现的代码示例:

const mysql = require('mysql2/promise');

async function checkDbType(connection) {
  const [rows] = await connection.execute('SELECT version() as version');
  const versionStr = rows[0].version;
  return versionStr.includes('MariaDB') ? 'mariadb' : 'mysql';
}

二、针对MariaDB手动解析JSON字符串

判断为MariaDB后,有两种方式处理JSON字符串转对象的需求:

方法1:查询结果后手动转换

async function fetchData(connection) {
  const dbType = await checkDbType(connection);
  const [rows] = await connection.execute('SELECT json_column FROM your_table');
  
  if (dbType === 'mariadb') {
    return rows.map(row => ({
      ...row,
      json_column: JSON.parse(row.json_column)
    }));
  }
  return rows;
}

方法2:全局配置类型转换器

在创建连接时,自定义类型转换规则,针对LONGTEXT类型(MariaDB存储JSON的默认类型)自动解析:

const connection = await mysql.createConnection({
  host: 'your_host',
  user: 'user',
  password: 'pass',
  database: 'db',
  typeCast: function(field, next) {
    // 针对LONGTEXT类型尝试解析JSON,可根据实际字段名进一步过滤
    if (field.type === 'LONGTEXT') {
      try {
        return JSON.parse(field.string());
      } catch (e) {
        // 解析失败返回原始字符串,避免程序崩溃
        return field.string();
      }
    }
    return next();
  }
});

额外提示

若你的MariaDB版本≥10.2.7,其实支持原生JSON类型,可执行ALTER TABLE your_table MODIFY COLUMN json_column JSON;修改字段类型,之后mysql2会自动将该字段解析为JSON对象,无需手动处理。

内容的提问来源于stack exchange,提问作者Eric Soren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 18:25:35