• mysql的安装、C++訪问mysql数据库、编码设置问题


    一.mysql的安装。这个相对简单,直接去官网下载mysql安装程序。就能够完毕安装过程,网上有非常多安装教程,这个没什么注意事项。

    二、C++訪问mysql。主要是用到mysql定义的头文件,内部定义了各种数据结构和函数,比方MYSQL,MYSQL_RES,MYSQL_ROW,mysql_real_connect等等一系列的结构和函数。这里要注意的就是将头文件及lib文件以及dll文件配置到当前开发环境来进行訪问mysql数据库。

    以最新的vs2013作为演示样例说一下配置过程。

    为了写的清晰点,在网上找了几张图来说明。

    1.要指定mysql所用到的头文件。能够直接将mysql安装文件夹下的include文件下的头文件复制到vs安装文件夹的include文件夹下,可是一般我们都是为编译器指定一个额外的头文件文件夹就可以。右键project-> properties然后例如以下图,在这个附加包括文件夹(Additional Include Directory)加入上mysql的include文件,此文件在mysql安装文件夹下,比如本人的安装文件夹

    C:Program FilesMySQLMySQL Server 5.1include



    2.指定mysql的库文件

    在连接器的常规以下。附加库文件夹(Additional Liberay Directory)加入上mysql安装文件夹下的lib文件夹的路径,本人的安装文件夹:

    C:Program FilesMySQLMySQL Server 5.5lib

    本文作者:csdn  iaccepted 凌风



    3.加入额外依赖(AdditionalDependencies),例如以下图。指定libmysql.lib,事实上就是在上面设置的库文件里指定用哪个lib文件而已。



    ok,到这里环境就配置完毕,接下来就能够进行连接mysql并进行数据库操作。

    本文作者:csdn  iaccepted 凌风


    在vs2013中新建一个project,然后依据mysql的官方API就能够完毕数据库操作。

    例如以下:

    #include "person.h"
    #include <Windows.h>
    #include <iostream>
    #include <string>
    #include <mysql.h>
    #include <winsock.h>
    
    
    using namespace std;
    
    int main(){
    	MYSQL *con;
    	MYSQL_RES *results;
    	MYSQL_ROW record;
    
    	char dbuser[30] = "root";
    	char dbpasswd[30] = "123456";
    	char dbhost[30] = "localhost";
    	char dbname[30] = "person";
    	char tname[30] = "person";
    	char *query = nullptr;
    
    	con = mysql_init(nullptr);
    
    	if (!mysql_real_connect(con, dbhost, dbuser, dbpasswd, dbname, 3306, NULL, 0)){
    		cerr << "Failed to connect database" << endl;
    		exit(2);
    	}
    
    
    	mysql_set_character_set(con, "gbk");
    	
    	mysql_query(con, "insert into person(id, name) values('370983198811256977', '个')");
    
    	mysql_query(con, "select name,id from person where id = '370983198811256977'");
    
    	results = mysql_store_result(con);
    
    	cout << mysql_num_fields(results) << endl;
    
    	while ((record = mysql_fetch_row(results))){
    		cout << record[0] << endl;
    	}
    	
    	mysql_close(con);
    	return 0; 
    }

    正常情况下编译并执行就能够了。

    可是有的时候会提示

    main.obj : error LNK2019: unresolved externalsymbol _mysql_num_fields@4 referenced in function _main

    1>main.obj : error LNK2019: unresolved externalsymbol _mysql_set_character_set@8 referenced in function _main

    1>main.obj : error LNK2019: unresolved externalsymbol _mysql_init@4 referenced in function _main

    1>main.obj : error LNK2019: unresolved externalsymbol _mysql_real_connect@32 referenced in function _main

    1>main.obj : error LNK2019: unresolved externalsymbol _mysql_query@8 referenced in function _main

    1>main.obj : error LNK2019: unresolved externalsymbol _mysql_store_result@4 referenced in function _main

    1>main.obj : error LNK2019: unresolved externalsymbol _mysql_fetch_row@4 referenced in function _main

    1>main.obj : error LNK2019: unresolved external symbol_mysql_close@4 referenced in function _main

    意思就是说这些符号都无法找到从而导致链接失败。

    非常明显编译是正常的仅仅是链接失败。首先回去检查上面的三项设置是否对了,假设没有错误的话可能是与系统的版本号有关,比方说你用的是64为的windows系统,可是建立project建立的却是32位的project。

    这是后同上面一样,project(project)右键->选项(properties)-> 在属性页(property pages)的最上面 有个平台选择(platform)然后选择x64,这样再回来编译就ok了

    本文作者:csdn  iaccepted 凌风

    三、中文乱码问题

    查看mysql的用户手冊能发现,mysql进行字符编码转换的步骤非常明白:

    1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;

    2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法例如以下:

    • 使用每一个数据字段的CHARACTER SET设定值。

    • 若上述值不存在,则使用相应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展。非SQL标准);

    • 若上述值不存在。则使用相应数据库的DEFAULT CHARACTER SET设定值;

    • 若上述值不存在,则使用character_set_server设定值。

    3. 将操作结果从内部操作字符集转换为character_set_results。

    普通情况下我们将mysql的默认编码设置为utf8格式。然后在在client进行操作。当有中文操作时。我们先更改client的编码比方改为gbk,然后进行插入读取,这时候mysql在接受到数据时发现是gbk编码的,如上会将gbk编码转换成character_set_server编码的数据进行存入。在这里也就是将gbk转换为utf8。读取的时候mysql会自己主动将读取的结果从内部字符集转换为character_set_results指定的编码,即从uft8转换为gbk从而不会产生编码问题。

    以上转换为自己主动进行的过程,程序猿要做的仅仅是设置好内部编码格式以及client编码格式就可以,这里的client是广义的。既能够指command lineclint 也能够仅仅应用程序,说白了就是不论什么要訪问mysql的东西统称为client。如上面样例中的代码。C++程序作为client时,由于要操作中文,所以首先使用

    mysql_set_character_set(con,"gbk");

    将client编码设置为gbk,这样存入的中文mysql会进行转换而成为utf8格式。读取的时候mysql又会从utf8格式转换成gbk返回给client。

    查看以上各编码的命令

    1. mysql> SHOW VARIABLES LIKE 'character%'; 
    就能够看到character_set_server、character_set_connection、character_set_results等的值。


    主要是理解上述所说的mysql字符编码转换的步骤,这样就能控制不会出现乱码问题。

    本文作者:csdn  iaccepted 凌风


  • 相关阅读:
    autodl3配置深度学习环境
    autodl使用2配置环境
    20220723图生成模型腾讯AI徐挺洋老师(分子生成)
    加班
    打比赛
    错过了一个比较大的编程比赛
    胡思乱想
    没有太复杂
    张远陆虎给从前的自己
    我还是会想
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7221952.html
Copyright © 2020-2023  润新知