Node.js执行MySQL查询报ER_DATA_TOO_LONG错误排查求助
这个问题有点迷惑人——明明你手动测试的SELECT语句在Workbench里完全正常,到了Node.js代码里就报data列太长的错误,而且你的查询里甚至没提到这个data列?我帮你一步步拆解可能的原因:
1. 先确认你代码里执行的SQL和测试的是否一致
你描述里贴的是一个指定了所有字段的长查询,但看你提供的代码片段,fullQuery用的是SELECT *:
var fullQuery = "SELECT * FROM `199_results` INNER JOIN `199_roster` ON `199_roster`.`ath_id` = `199_results`.`ath_id` WHERE `199_results`.`date` BETWEEN '2018-04-01 00:00:01' AND '2018-05-08 23:59:59';"
SELECT *会返回199_results和199_roster表里的所有字段,包括你没在手动查询里列出的data列。如果这个data列存储的内容长度超过了它的定义(比如列是VARCHAR(255)但实际内容更长),那么:
- Workbench里跑你手动写的指定字段查询时,根本不会读取
data列,所以不会触发错误; - Node.js里跑
SELECT *会读取这个字段,就触发了ER_DATA_TOO_LONG错误。
解决方法:把代码里的fullQuery替换成你在Workbench测试通过的那个长字段列表,再执行看看是否还报错。
2. 检查表结构是否存在data列
如果替换SQL后还是报错,先确认两张表里确实有data列:
在Workbench里执行这两个命令:
DESCRIBE 199_results; DESCRIBE 199_roster;
查看输出的字段列表,找到data列的类型(比如VARCHAR(255)、TEXT等),然后检查该列的实际数据长度:
SELECT LENGTH(data) AS data_length FROM 199_results ORDER BY data_length DESC LIMIT 10; SELECT LENGTH(data) AS data_length FROM 199_roster ORDER BY data_length DESC LIMIT 10;
如果发现有数据长度超过了列的定义,要么修改列类型(比如改成TEXT或VARCHAR(1024)),要么清理超长的数据。
3. 对比Workbench和Node.js的连接配置差异
如果表结构和数据都没问题,那可能是连接参数的差异导致的:
3.1 检查sql_mode设置
Workbench和Node.js的连接可能使用了不同的SQL模式。在Workbench里执行:
SELECT @@sql_mode;
然后在Node.js代码里添加一个查询,输出同样的结果:
db.query('SELECT @@sql_mode;', (err, rows) => { if (err) console.error(err); else console.log('Node.js sql_mode:', rows[0]['@@sql_mode']); });
如果Node.js的sql_mode包含STRICT_TRANS_TABLES或STRICT_ALL_TABLES,而Workbench的不包含,那么Node.js连接会严格校验字段长度,触发错误,而Workbench不会。你可以在Node.js的数据库连接配置里添加sqlMode参数,和Workbench保持一致:
const db = require('mysql').createConnection({ // 其他配置 sqlMode: 'NO_ENGINE_SUBSTITUTION' // 替换成Workbench里查到的sql_mode值 });
3.2 检查字符集设置
Node.js的mysql库默认字符集是utf8,而Workbench可能用的是utf8mb4。如果data列里有emoji或其他4字节Unicode字符,utf8编码会把它们当成多个字符,导致长度计算错误,触发超长错误。你可以在连接配置里指定字符集:
const db = require('mysql').createConnection({ // 其他配置 charset: 'utf8mb4' });
4. 排查是否有触发器影响
最后一种少见的情况:如果两张表有触发器,在执行SELECT时可能会触发对data列的操作,导致错误。你可以在Workbench里查看触发器:
SHOW TRIGGERS LIKE '199_%';
如果有相关触发器,检查它的逻辑是否会读取或修改data列,导致超长错误。
内容的提问来源于stack exchange,提问作者Paul Schorey

