c++ - c ++ mysql上第64位之后的随机字符
问题描述
通过我的 c++ 应用程序与 mysql db 交互时,我遇到了一个非常奇怪的问题。
环境:
码头工人-compose.yml
version: '3.1'
services:
db:
image: mysql:8.0.21 #libmysqlcppconn8-2_8.0.21-1ubuntu18.04_amd64.deb connector
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
security_opt:
- seccomp:unconfined
client:
build: .
ports:
- "2890:2890"
客户端容器是 ubuntu18.04,这里有一个简单的代码来测试连接和一个最小的结果:
#include <cstdio>
#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include "mysql_connection.h"
#include <array>
#include <cppconn/driver.h>
#include <cppconn/exception.h>
#include <cppconn/prepared_statement.h>
#include <cppconn/resultset.h>
#include <cppconn/statement.h>
int main() {
sql::Driver *driver = get_driver_instance();
sql::Connection *con =
driver->connect("tcp://remote_backup_db_1", "root", "example");
con->setSchema("db_test");
sql::PreparedStatement *stmt;
sql::ResultSet *res;
stmt = con->prepareStatement("SELECT test from t;");
res = stmt->executeQuery();
if (res->rowsCount() > 0) {
if (res->next()) {
std::string text = res->getString("test");
std::clog << "text: " << text << "\n";
}
}
return 0;
}
这是表格的描述:
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| test | varchar(128) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
问题:当我尝试检索小于 64 字节的文本时,一切正常,但是当我尝试使用大于 64 字节的文本执行相同的代码时,它检索前 64 字节后跟随机字符。该问题似乎与列类型无关(例如,与 blob 相同的问题)。它似乎与编码有关,因为当我尝试获取结果长度时,它设置正确(例如,长度为 70 个字符的文本给我 70 个)。
我已经尝试更改表编码,但我不知道如何解决这个问题。(ps 我基本上不使用奇怪的字符,只使用 ASCII)。
解决方案
推荐阅读
- r - 组合变异和重新编码功能失败
- firebase - 如何在 Firebase 中按子值排序
- javascript - 从订阅/可观察中抛出错误 - Angular2+
- c++ - 从相同类型的静态成员进行类内初始化
- symfony - CollectionType 通过 form_theme 自定义原型
- nginx - Nginx - 动态虚拟主机的 error_log
- spring - Spring Boot 如何在异步方法中简化 Scope Request bean?
- python - 使用 tf.data.Dataset.from_generator() 时的参数化生成器
- sql-server - 传递参数为null时选择所有数据
- javascript - 如何从数组对象中返回多个值作为新变量?