VC 连接mysql, mysql 中午乱码问题

本文展示了一个使用 C++ 和 MySQL 进行数据增删改查(CRUD)操作的示例程序。通过此示例,读者可以了解如何连接 MySQL 数据库、执行 SQL 语句并处理结果集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32")
#pragma comment(lib, "libmysql")
#include "mysql.h" 
int main(int argc, char* argv[])
{
 int j;
 int res,sel;
 int selId,upd,del;
 char str[100];
 char  sql[100];
    MYSQL mysql;
    MYSQL_RES *resultset;
    MYSQL_ROW row; 
    mysql_init(&mysql);// 初始化mysql结构 
 //mysql_real_connect()函数的功能是连接一个MYSql数据库服务器,MYSQL结构地址是&mysql,host主机名或ip地址是localhost,用户名是root,密码是root,数据库是mydb,端口是3306
    if (!mysql_real_connect(&mysql, "localhost", "root", "root", "student", 3306, NULL,0))
    {
        printf("\n数据库连接发生错误!");
    }
    else
    {
        printf("\n数据库连接成功!\n");
  //插入一条数据到数据库
  //mysql_set_character_set(&mysql, "GB2312") ;//可以插入中文的
  
 //////////////////////////////

 
  res = mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8"); //很重要
 

 

  /////////////////////////////////////
strcpy((char*)str,"dd大大");

 // res = mysql_query(&mysql, "insert into mytable( username,age,score,id) values('"+str+"',33,3,18)");
  sprintf(sql,"insert   into   mytable( username,age,score,id)   values('%s',65,65,65) ",str);
res=mysql_real_query(&mysql,sql,strlen(sql));
//printf("strlen(sql)=%d\n",strlen(str));
        if(res)
        {  
   printf("插入数据失败!\n");
        }
        else
  {
   //mysql_affected_rows() -- 返回插入或者更新成功的行数。
   //printf("插入%d行数据成功!\n",(unsigned long)mysql_affected_rows(&mysql));
   printf("成功插入一行数据!\n");
  }
  
  //修改数据 
  upd = mysql_query(&mysql, "update mytable set username='l2222' where id=18");
  if(upd){
   printf("\n数据库更改发生错误\n");
  }
  else{
   printf("\n数据库更改数据成功\n");
  }
  
  //检索全部数据
  
  sel=mysql_query(&mysql,"select * from mytable");
        if(sel)
  {
   printf("数据库查询发生错误");
  }
  else
  {           
   printf("\n查询数据为:\n");        
   resultset = mysql_store_result(&mysql);// 获得结果集        
   if (mysql_num_rows(resultset) != NULL)
   {
    int numRows = mysql_num_rows(resultset); // 获得结果集中的记录数
    int numFields = mysql_num_fields(resultset);// 获得表中字段数
    printf("共 %d 行记录,每行 %d 个字段。", numRows, numFields);
    j = 1;
    //mysql_fetch_row()函数是查询成功后,把查询结果的一行取到一个数组中,以备使用.
    //每执行一次mysql_fetch_row(),将自动取到结果中的下一行记录。
                while (row = mysql_fetch_row(resultset))
                {
                    int i = 0;
                    printf("\n 第 %d 行:", j);
     for (i = 0; i < numFields; i++)
     {
      fprintf(stdout, " %s", row[i]); // 打印字段值
     }
                    j++;
    }
   }
   else
   {
    printf("\n无查询结果!");
   }   
   mysql_free_result(resultset);  // 释放结果集
        }
  
  del=mysql_query(&mysql,"delete from mytable where id=16");
  if(del){
   printf("\n数据库删除发生错误\n");
  }
  else{
   printf("\n数据库数据删除成功\n");
  }
    } 
    mysql_close(&mysql); // 释放数据库连接
 fgetchar();
 return 0;
}

<think>好的,用户现在问的是在VC(Visual C++)中使用MySQL时应该选择什么字符编码最好。我需要先理解用户的需求,可能他们在开发一个C++应用程序,使用MySQL作为数据库,遇到了字符编码的问题,或者想预防乱码等情况。 首先,用户可能不太清楚字符编码的基本概念,比如UTF-8、GBK之类的区别,所以需要解释为什么选择特定的编码。然后,他们可能想知道在VC(Visual C++)环境下,如何设置MySQL的字符集,确保从数据库到应用程序的数据传输过程中不会出现乱码。 接下来,我需要考虑MySQL的版本,不同版本可能有不同的默认编码。例如,MySQL 8.0默认使用utf8mb4,而旧版本可能使用latin1。所以需要建议用户使用utf8mb4,因为它支持更广泛的Unicode字符,包括表情符号等。 另外,VC++应用程序本身处理字符串的方式也很重要。如果用户使用的是多字节字符集还是Unicode,这会影响他们如何在代码中处理字符串。可能需要建议在VC项目中使用Unicode设置,这样和MySQL的utf8mb4配合更好。 还要考虑连接MySQL时的字符集设置,比如在连接字符串中指定characterEncoding=utf8mb4,或者使用SET NAMES命令。同时,需要提醒用户注意MySQL的配置文件(my.ini或my.cnf)中的设置,确保服务器、数据库和表的默认字符集都是utf8mb4。 可能用户在实际操作中遇到了乱码问题,比如数据插入或查询时出现问号或乱码,这时候需要检查各个环节的编码是否一致。例如,数据库、表、字段的字符集,连接器的配置,以及应用程序本身的编码设置。 另外,需要提到排序规则(collation),比如utf8mb4_unicode_ci,这会影响字符串比较和排序的规则。正确的排序规则选择也很重要,尤其是在多语言环境下。 可能用户还会混淆utf8和utf8mb4,因为在MySQL中,utf8实际上是阉割版的,只支持最多3个字节,而utf8mb4才是完整的4字节UTF-8编码。这点需要特别强调,避免用户误用utf8导致无法存储某些字符。 最后,总结最佳实践,包括统一使用utf8mb4,检查各层配置,使用合适的连接参数,以及在VC++中正确处理字符串。可能还需要给出示例代码,说明如何在连接数据库时设置字符集,比如使用MySQL Connector/C++时的参数设置。 需要确保回答结构清晰,步骤明确,用户能够按照指导一步步配置环境,避免遗漏关键点。同时提醒常见的陷阱,比如旧版本的MySQL不支持utf8mb4,或者VC项目设置不正确导致的编码问题。</think>### MySQL 字符编码最佳实践(Visual C++ 开发场景) --- #### **核心原则**:**统一使用 `utf8mb4` 编码** > 在 Visual C++ 与 MySQL 交互场景中,`utf8mb4` 是唯一推荐的全兼容字符集,原因如下: > 1. 支持完整 Unicode(含 emoji 等 4 字节字符) > 2. 完美兼容现代多语言需求 > 3. 避免 MySQL 的 `utf8` 伪实现问题MySQL 的 `utf8` 实际是阉割版) --- ### **完整配置流程** #### **1. MySQL 服务端配置** 修改 `my.ini`/`my.cnf`: ```ini [mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci ``` #### **2. 数据库创建** ```sql CREATE DATABASE your_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` #### **3. 表级定义** ```sql CREATE TABLE your_table ( id INT PRIMARY KEY, content VARCHAR(255) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; ``` #### **4. VC++ 连接设置** 使用 MySQL Connector/C++ 时需明确指定编码: ```cpp sql::ConnectOptionsMap connection_properties; connection_properties["hostName"] = "localhost"; connection_properties["userName"] = "root"; connection_properties["password"] = "123456"; connection_properties["characterEncoding"] = "UTF-8"; // 关键参数 connection_properties["useSSL"] = "false"; sql::Driver* driver = get_driver_instance(); sql::Connection* con = driver->connect(connection_properties); ``` --- ### **关键注意点** #### **编码一致性检查** ```sql -- 验证各层级编码 SHOW VARIABLES LIKE 'character_set%'; SHOW CREATE DATABASE your_db; SHOW CREATE TABLE your_table; ``` #### **VC++ 工程设置** 1. 项目属性 → 高级 → 字符集 → **使用 Unicode 字符集** 2. 字符串处理建议: ```cpp // 使用宽字符串(wstring)进行中间处理 std::wstring wsContent = L"中文内容"; // 转换为 UTF-8 格式传输到 MySQL std::string utf8Content = WideToUTF8(wsContent); ``` #### **连接参数陷阱** 错误配置示例(导致乱码): ```cpp // 错误:未明确指定编码 connection_properties["characterEncoding"] = ""; // 错误:使用错误编码标识 connection_properties["characterEncoding"] = "GBK"; ``` --- ### **编码问题诊断表** | 现象 | 可能原因 | 解决方案 | |-----------------------|---------------------------|------------------------------| | 中文显示为问号(???) | 传输层编码不匹配 | 检查连接字符串characterEncoding参数 | | 部分字符无法插入 | 使用`utf8`而非`utf8mb4` | 修改表字段字符集 | | 控制台输出乱码 | VC++控制台代码页设置错误 | 使用`system("chcp 65001")` | | 网页显示异常 | HTTP头未声明UTF-8 | 添加`Content-Type: text/html; charset=utf-8` | --- ### **性能优化建议** 1. **索引优化**:`utf8mb4` 字段建立前缀索引 ```sql ALTER TABLE log ADD INDEX (content(20)); ``` 2. **排序规则选择**: - 中文优先:`utf8mb4_zh_0900_as_cs`(MySQL 8.0+) - 通用场景:`utf8mb4_unicode_ci` --- ### **迁移旧数据方案** ```sql -- 转换已有数据库编码 ALTER DATABASE old_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 转换表编码 ALTER TABLE old_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` --- ### **特殊场景处理** 1. **BLOB类型处理**: ```cpp // 二进制数据应使用预处理语句 sql::PreparedStatement* pstmt = con->prepareStatement("INSERT INTO files(data) VALUES(?)"); std::istream* blob_data = new std::istringstream(binary_data); pstmt->setBlob(1, blob_data); ``` 2. **命令行工具编码**: ```bash mysql -u root -p --default-character-set=utf8mb4 ``` 通过统一使用 `utf8mb4` 编码体系,可确保从 VC++ 应用到 MySQL 存储的全链路字符兼容性。实际开发中需特别注意连接器配置与工程设置的匹配性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值