【发布时间】: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 知道它是什么并获取它。我似乎无法用它做任何事情,甚至没有转储字节,所以我可以看看里面有什么。我需要编写自定义类型转换器吗?