2017-08-20 28 views
0

我有一个脚本可以创建一个数据库,其中有几个表并填充数据。该脚本是从Windows上的SQLite数据库创建的。该脚本中的其中一个表名为“abcß”(“abc + ALT225”)。跨平台mySQL与字符集的不一致性

接下来我尝试通过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:

以下是我在工作台中看到:

# 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, '', '' 
+0

UTF-8是'char'兼容,这就是使用它,而不是UTF-16的整点。使用带有UTF-8的'std :: string'应该是安全的,而不是与'std :: wstring'转换复杂。 – Havenard

+0

@Havenard,该程序是跨平台的,因此它也应该在Windows上运行。 AFAIK,Windows是UTF-16平台。 – Igor

+0

实际上,所有采用字符串的Windows API都具有'char'版本和'wchar_t'版本。默认情况下Visual Studio会尝试使用宽字符,但你完全可以告诉它在项目设置中隐藏起来。 – Havenard

回答

0

不要使用UTF-16任何东西。

请勿使用“unicode”。

那里的确没有\0d-61从哪里来?

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

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

+0

我不知道它来自哪里,但这是我用'mysql_fetch_row()'读取查询结果时看到的。该脚本来自Windows。在mySQL Workbench中运行查询不会在Windows和Linux中生成“abcß”。 – Igor

+0

也我不能确定它被编码为UTF-8。脚本来自Windows,我将它运行在与Linux上运行的服务器相连的Workbench的Linux副本上。 – Igor

+0

INSERT最初是如何执行的?那是'CREATE TABLE();'而不是'INSERT INTO;'的 –