我有一个脚本可以创建一个数据库,其中包含几个表并填充数据。此脚本是在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, '', ''
答案 0 :(得分:0)
不要将utf-16用于任何事情。
请勿使用“unicode”。
\0d-61
来自哪里?
不要使用任何转换子程序,返回源并确保它编码为UTF-8。
为验证您使用的是UTF-8,abcß
为十六进制61 62 63 C39F