跨平台的mySQL与字符集的不一致

时间:2017-08-20 00:08:37

标签: c++ mysql encoding

我有一个脚本可以创建一个数据库,其中包含几个表并填充数据。此脚本是在Windows上的SQLite数据库中创建的。该脚本中的一个表名为“abcß”(“abc + ALT225”)。

接下来,我尝试通过mySQL Workbench将此脚本加载到mySQL。服务器和Workbench都在Linux上运行。

在修复了一些语法不一致之后,数据库已成功创建。我试图查询数据库和表。所有表格都成功查询,但上面的表格。

尝试查询“information_table.tables.table_name”,我得到的名称为“abc \ 0d-61 \ 0d63”,其结果与原始名称不同。因此,当我运行它时,我的程序崩溃,因为我将表名发送到codecvt_utf-8编码器。

使用默认编码创建数据库和表。

有人知道为什么我没有看到正确的结果吗?

但最重要的是 - 我认为程序崩溃是因为某些字符不在wchar_t / utf-8编码中。所以我很好奇 - 我应该用什么来将该序列转换为std :: wstring?

TIA!

编辑:

代码如下:

class MySQLDatabase
{
public:
    int LoadDatabaseData();
protected:
     struct MySQLImpl;
     MySQLImpl *m_pimpl;
};

struct MySQLDatabase::MySQLImpl
{
   std::wstring_convert<std::codecvt_utf8<wchar_t> > m_myconv;
};

int MySQLDatabase::LoadDatabaseData()
{
    const char *table_name;
    std::wstring tableName = m_pimpl->m_myconv.from_bytes( table_name );
}

EDIT2:

如果我添加以下内容,您认为它会起作用吗?

   std::wstring_convert<std::codecvt_utf16<wchar_t> > m_myconv;

EDIT3:

以下是我在Workbench中看到的内容:

# TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE, VERSION, ROW_FORMAT, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE, AUTO_INCREMENT, CREATE_TIME, UPDATE_TIME, CHECK_TIME, TABLE_COLLATION, CHECKSUM, CREATE_OPTIONS, TABLE_COMMENT
'def', 'draft', 'abcÃ', 'BASE TABLE', 'InnoDB', '10', 'Compact', '0', '0', '16384', '0', '0', '0', NULL, '2016-12-09 00:15:27', NULL, NULL, 'utf8_general_ci', NULL, '', ''

1 个答案:

答案 0 :(得分:0)

不要将utf-16用于任何事情。

请勿使用“unicode”。

\0d-61来自哪里?

不要使用任何转换子程序,返回源并确保它编码为UTF-8。

为验证您使用的是UTF-8,abcß为十六进制61 62 63 C39F