我有一个脚本可以创建一个数据库,其中有几个表并填充数据。该脚本是从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, '', ''
UTF-8是'char'兼容,这就是使用它,而不是UTF-16的整点。使用带有UTF-8的'std :: string'应该是安全的,而不是与'std :: wstring'转换复杂。 – Havenard
@Havenard,该程序是跨平台的,因此它也应该在Windows上运行。 AFAIK,Windows是UTF-16平台。 – Igor
实际上,所有采用字符串的Windows API都具有'char'版本和'wchar_t'版本。默认情况下Visual Studio会尝试使用宽字符,但你完全可以告诉它在项目设置中隐藏起来。 – Havenard