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

使用mysql1连接MySQL时INSERT语句触发RangeError问题求助

Dart mysql1包执行INSERT时报RangeError(byteOffset)的解决方法

问题现象

使用mysql1包连接MySQL数据库,连接和建表操作都正常,但执行带占位符的INSERT语句时抛出字节偏移越界的异常,报错信息如下:

Unhandled exception:
RangeError (byteOffset): Invalid value: Not in inclusive range 0..5: 7
#0      _ByteDataView.getUint16 (dart:typed_data-patch/typed_data_patch.dart:4824:7)
#1      Buffer.readUint16 (package:mysql1/src/buffer.dart:240:24)
#2      new PrepareOkPacket (package:mysql1/src/prepared_statements/prepare_ok_packet.dart:20:30)
#3      Handler.checkResponse (package:mysql1/src/handlers/handler.dart:68:24)
#4      PrepareHandler.processResponse (package:mysql1/src/prepared_statements/prepare_handler.dart:45:18)
#5      ReqRespConnection._handleData (package:mysql1/src/single_connection.dart:355:32)
#6      ReqRespConnection._handleHeader (package:mysql1/src/single_connection.dart:324:13)
<asynchronous suspension>
#7      ReqRespConnection._readPacket (package:mysql1/src/single_connection.dart:309:7)
<asynchronous suspension>

涉事代码:

import 'package:mysql1/mysql1.dart';

Future main() async {
    final conn = await MySqlConnection.connect(ConnectionSettings(
        host: 'localhost',
        port: 3306,
        user: 'root',
        db: 'db',
        password: 'password'));


     var result = await conn.query(
        'INSERT INTO users (username, password, email) VALUES (?, ?, ?)', ['name', 'password', 'email']);

}

解决方案

1. 升级mysql1包到最新版本

这个问题大多是旧版mysql1和高版本MySQL(8.0+)的兼容性问题,旧包解析MySQL响应字节包的逻辑存在缺陷。

  • 打开pubspec.yaml,将mysql1版本更新为最新:
    dependencies:
      mysql1: ^最新版本号
    
  • 执行dart pub get更新依赖。

2. 显式指定连接字符集

如果升级后问题仍存在,试试在连接设置里指定字符集为utf8mb4或utf8,避免字符集不匹配导致的包解析错误:

final conn = await MySqlConnection.connect(ConnectionSettings(
    host: 'localhost',
    port: 3306,
    user: 'root',
    db: 'db',
    password: 'password',
    charset: 'utf8mb4' // 也可以用 'utf8'
));

3. 临时绕过预编译语句(仅测试用)

如果需要快速验证功能,可以直接拼接SQL语句(注意:生产环境禁止这么做,会有SQL注入风险):

var username = 'name';
var password = 'password';
var email = 'email';
var result = await conn.query(
    'INSERT INTO users (username, password, email) VALUES ("$username", "$password", "$email")'
);

4. 确认MySQL版本兼容性

如果用的是MySQL 8.0以上版本,确保mysql1包版本支持该版本。部分旧版mysql1对MySQL 8.0的新协议支持不足,升级包是最根本的解决办法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:25:47