如何判断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
相关产品推荐
相关产品推荐

