使用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
相关产品推荐
相关产品推荐

