具体表现为
使用 Navicat Lite 写入 sqlite3 表中的 text 字段,当内容包含换行符的时候.
使用dart sqlite3库读取到的字段内容是 Uint8List
使用Navicat Lite导出sql 变为 X'62620D0A' 以X开头的字符串
查询一圈找到原因:
关于sqlite的文本字段插入blob数据_sqlite text blob-CSDN博客
sqlite的文本字段类型为Text,如果对数据库操作时直接在该字段以blob的形式插入数据
(即使是文本数据),也会导致sqlite3_column_type函数获取字段类型时返回blob类型,
导致后续处理失败。
Text字段以blob的形式插入数据:数据HEX字符串,“X”模式插入字段。
基本确定就是 Navicat Lite的bug,不确定 Navicat 其他版本是否有这个bug.
解决方案:
如果无法保证DB文件的来源就只能在 dart上面下手,
方案一 直接判断数据类型 转为String
方案二 直接修改 sqlite3 扩展源码
src\implementation\statement.dart
Object? _readValue(int index) {
final type = statement.sqlite3_column_type(index);
switch (type) {
case SqlType.SQLITE_INTEGER:
const hasNativeInts = !identical(0.0, 0);
if (hasNativeInts) {
return statement.sqlite3_column_int64(index);
} else {
// Wrap in BigInt if needed
return statement.sqlite3_column_int64OrBigInt(index);
}
case SqlType.SQLITE_FLOAT:
return statement.sqlite3_column_double(index);
case SqlType.SQLITE_TEXT:
return statement.sqlite3_column_text(index);
case SqlType.SQLITE_BLOB:
return statement.sqlite3_column_bytes(index);
case SqlType.SQLITE_NULL:
default:
return null;
}
}
强制 BLOB 返回 String(不过这样就不能正常读取BLOB)