繁体   English   中英

通过C ++ ODB将汉字插入mysql时出现问题

[英]problem when inserting chinese characters into mysql via C++ ODB

我不是说英语的人,请容忍我的表情。 当我通过odb将一些汉字插入mysql 5.7中时,出现错误消息“第1行“ NATION”列的字符串值不正确:'\\ xD6 \\ xD0 \\ xB9 \\ xFA'”,我知道这是错误的字符设置设置好之后,我尽力解决了这个问题,但徒劳无功。

我的项目中使用了odb 2.4,mysql 5.7,mysql连接器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服务器似乎没有错:

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 libraray,如下所示:

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工作台中查询字符集,我得到的信息与上述不同,我不知道为什么,这很奇怪。

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字符集重新创建了数据库,一切保持不变,多么绝望!

我仔细检查了utf8的Visual Studio设置,发现默认设置为带签名的UTF-8,将其更改为不带签名的utf-8使得问题消失了!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM