【问题标题】:Converting mysqlx::Value to std::string with special characters使用特殊字符将 mysqlx::Value 转换为 std::string
【发布时间】:2019-03-07 00:12:07
【问题描述】:

我正在尝试转换一个 mysqlx::Value 类型,它应该是一个字符串,但其中包含特殊的非标准语言字符。我需要将其作为 std::string 或等价物处理。

我正在使用 mysql C++ 连接器 XDevAPI 来检索数据。

mysqlx::Session sess(_db_conn_info.db_host, _db_conn_info.db_port, _db_conn_info.db_user, _db_conn_info.db_pass);
    mysqlx::Schema db = sess.getSchema(_db_conn_info.db_name);

    mysqlx::Table artist_table = db.getTable("Artist");
    mysqlx::RowResult artist_result = artist_table.select("id", "a_id", "name", "is_australian")
        .where("id like :artist_id").bind("artist_id", artist_id).execute(); 

mysqlx::Row row = artist_result.fetchOne();

row[2] 值中的名称列有时可以包含以下字符:é 或 í

我想将 mysqlx::Value 结果传递给 std::string 对象或类似对象。 注意:这在字符串不包含特殊字符时可以正常工作。

我尝试使用字符串流,但是当字符串包含特殊字符时,我得到“CDK 错误:字符串转换错误”。

std::stringstream name;
name << row[2]; // Exception throws here

编辑:ubuntu 18.04,gcc 7.3.0

【问题讨论】:

  • 似乎 mysqlx::Value::getType() 成员也不知道结果是什么类型。我测试了一个已知的好字符串,它返回类型 6(这是一个字符串)。当我针对具有特殊字符的值运行它时,它会引发异常。
  • 用 wchar 试过了,没有运气。似乎从 mysql 中拉回的列数据是不可读的,尽管通过工作台直接查询 db 显示该值很好。我在想可能是字符集/排序规则设置,但我不知道如何使用 xdevapi 进行设置?
  • 好的,所以我可以从 xdevapi 获取类型,它可以理解为 STRING 或 ENUM 6 类型。但如果我尝试对它执行任何操作,例如 sstream、wstring、wchar、char、codecvt等等,编译器一直告诉我没有办法将它从 mysqlx::Value 类型转换为我正在尝试的任何类型。该值从数据库中编码为 utf8mb4,因此 mysql API 知道它是什么并获取它。我似乎无法用它做任何事情,甚至没有转储字节,所以我可以看看里面有什么。我需要编写自定义类型转换器吗?

标签: c++ mysql c++11


【解决方案1】:

原来我使用的 mysql-cpp-connector 版本存在 utf8mb4 字符编码的已知错误。 (/tears hair out),升级修复它。

【讨论】:

    猜你喜欢
    • 2018-11-23
    • 2015-06-24
    • 1970-01-01
    • 2018-09-23
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    相关资源
    最近更新 更多