通过C ODB插入汉字时的问题

problem when inserting chinese characters into mysql via C++ ODB

本文关键字:问题 汉字 插入 ODB 通过      更新时间:2023-10-16

我不是说英语的人,请宽容我的表情。当我通过ODB将一些汉字插入MySQL 5.7时,我收到了错误消息"不正确的字符串值:' xd6 xd0 xb9 xb9 xfa'for Column'nation in Row 1",我知道这是字符的错误设置设定,我努力解决这个问题,但都是徒劳的。

ODB 2.4,MySQL 5.7,MySQL Connector C6.1.11和Visual Studio 2015在我的项目中使用,我已经将设置的MySQL字符更改为UTF8MB4。以下是我的MySQL配置文件:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4'
skip-character-set-client-handshake = true
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4

,MySQL Server似乎没有错:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_general_ci |
| collation_database       | utf8mb4_general_ci |
| collation_server         | utf8mb4_general_ci |
+--------------------------+--------------------+
mysql> show create table basininfo;
------------------------------------------------------------------------------------------------+
    | basininfo | CREATE TABLE `basininfo` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `BASIN_NAME` varchar(1000) DEFAULT NULL,
      `NATION` varchar(1000) DEFAULT NULL,  
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 

我还尝试更改为MySQL 8.0,将UTF8MB4字符硬编码到libodb-mysql库中,如下:

mysql_options(handle_, MYSQL_SET_CHARSET_NAME, "utf8mb4");
mysql_options(handle_, MYSQL_INIT_COMMAND, "SET NAMES utf8mb4");

但是所有这些都无法解决我的问题。

代码诱导的错误如下所示:

auto_ptr<odb::database> db(
    new odb::mysql::database(
    "news"     // database login name  
    , "news123" // database password  
    , "newsdb" // database name  
    , "localhost"
    , 3306
    , nullptr
    ,"utf8mb4"
)); 
transaction t(db->begin());         
BasinInfo binfo;
binfo.setNation("中国"); //chinese character insert into column Nation
db->persist(binfo);
t.commit();

问题已经花了两天时间,让我绝望,请帮助我锻炼,真的很感激!

附录信息:如果我查询MySQL Workbench中设置的字符,我收到的消息与上述不同,我不知道为什么,这很奇怪。

SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
Variable_name,Value
character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8mb4
character_set_filesystem,binary
character_set_results,utf8
character_set_server,utf8mb4
character_set_system,utf8
collation_connection,utf8_general_ci
collation_database,utf8mb4_general_ci
collation_server,utf8mb4_general_ci

附录信息2:我使用UTF8 Charset重新创建数据库,一切保持不变,多么拼命!

i仔细检查了UTF8的Visual Studio设置,发现默认设置为带有签名的UTF-8,将其更改为UTF-8,而无需签名使问题消失了!