在 Windows 下使用 C++ 操作 SQLite 数据库时,中文字段经常出现 写入成功但内容显示为 BLOB 或 乱码 的问题。根本原因在于 SQLite 要求字符串以 UTF-8 编码 存储,而默认的 std::string 中文通常是 GB2312/ANSI 编码。
在 C++ (如 Visual Studio) 中使用 std::string 把含有中文的字符串插入到 SQLite 数据库时:
std::string desc = "搬运动作:从 Port2 取片 → Port3 放片";
m_pDB->executeQuery("INSERT INTO ... VALUES ('" + desc + "');");
结果: description 列在 SQLite 中显示为 BLOB,而不是文本

SQLite 要求所有 TEXT 类型的字符串必须为 UTF-8 编码。
而 VS 编译器中直接写入 std::string 的中文,实际编码是 GB2312 / GBK / ANSI,并非 UTF-8
// 本地编码转为 UTF-8
std::string TransferManager::ansiToUtf8(const std::string& ansiStr) {
int wideLen = MultiByteToWideChar(CP_ACP, 0, ansiStr.c_str(), -1, nullptr, 0);
std::wstring wideStr(wideLen, 0);
MultiByteToWideChar(CP_ACP, 0, ansiStr.c_str(), -1, &wideStr[0], wideLen);
int utf8Len = WideCharToMultiByte(CP_UTF8, 0, wideStr.c_str(), -1, nullptr, 0, nullptr, nullptr);
std::string utf8Str(utf8Len, 0);
WideCharToMultiByte(CP_UTF8, 0, wideStr.c_str(), -1, &utf8Str[0], utf8Len, nullptr, nullptr);
utf8Str.pop_back(); // 去掉最后的 '\0'
return utf8Str;
}
使用:
std::string raw = "搬运动作:从 Port2 取片 → Port3 放片"; // 系统本地编码
std::string utf8 = TransferManager::ansiToUtf8(raw);
data.strDescription = utf8;

可使用:
std::string TransferManager::wstringToUtf8(const std::wstring& wstr);
或者使用 CStringW → std::wstring → UTF-8
CStringW wdesc = L"搬运动作:从 Port2 取片 → Port3 放片";
data.strDescription = TransferManager::wstringToUtf8(std::wstring(wdesc));
// UTF-8 转为本地编码
std::string TransferManager::utf8ToAnsi(const std::string& utf8Str) {
int wideLen = MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, NULL, 0);
std::wstring wideStr(wideLen, 0);
MultiByteToWideChar(CP_UTF8, 0, utf8Str.c_str(), -1, &wideStr[0], wideLen);
int ansiLen = WideCharToMultiByte(CP_ACP, 0, wideStr.c_str(), -1, NULL, 0, NULL, NULL);
std::string ansiStr(ansiLen, 0);
WideCharToMultiByte(CP_ACP, 0, wideStr.c_str(), -1, &ansiStr[0], ansiLen, NULL, NULL);
ansiStr.pop_back(); // 去掉最后的 '\0'
return ansiStr;
}
可用于日志输出或 UI 控件显示。
插入前输出:
printf("准备插入 UTF-8 字符串:%s\n", data.strDescription.c_str());
验证方式:
| 场景 | 建议方式 |
|---|---|
| 插入中文到 SQLite | ansiToUtf8 |
| 从 SQLite 读取后展示 | utf8ToAnsi |
| 项目编码设置 | 设置为 UTF-8 无 BOM |
| VS 源文件保存编码 | 另存为 UTF-8 编码 |
只要 std::string 中的中文不是 UTF-8 编码,SQLite 插入后就会出现异常(显示为 BLOB 或乱码)。

