首页 > 解决方案 > 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)。

标签: c++mysqldockerdocker-compose

解决方案


推荐阅读