c mysql 写入中文_C/C++ 向mysql数据库读取、写入中文的解决方法

1.首先需要设置mysql服务器的字符集;

一般默认情况下是默认为latinl,你可以手动修改;

这里提供一劳永逸的方法,直接修改配置文件my.ini或者是my.conf,把[mysql]与[mysqld]下的default-character-set=latinl修改为:

default-character-set=utf8;

或者你可以每次都到mysql命令行去设定下;

这里要讲下几个相关的字符集设置项:

character_set_results=utf8; //这个是用来设置查询返回结果的字符集

character_set_client=utf8; //设置客户端的字符集

character_set_connection=utf8; //设置连接的字符集

还有其他几个最好也设置成utf8吧。

显示MYSQL字符集编码 :show variables like 'character%';

类似下面:

+--------------------------+----------------------------+

| Variable_name | Value |

+--------------------------+----------------------------+

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |

+--------------------------+----------------------------+

查看表新建时的字符集:show create table xxxx

查看数据库新建时的字符集:show create database xxxx

更改表的默认字符集: alter table xxxx charset=utf8

更改数据库的默认字符集:alter database xxx charset=utf8

2.当上面都已设置好以后,基本也就可以了,大家都这么说,其实不然;

在C/C++使用API连接到mysql数据库时,需要在连接后设置字符集,调用API函数mysql_set_character_set(&m_mysql, "utf8");

到这里,你可以试下是不是能够插入中文了,还是说当有中文的时候就插不进去,没有中文就可以插进去,如果你成功了,那就不用往下看了;

如果没有就看下一步;

3.代码中的字符集转换;

首先把VC++中的sql语句从gb2312转为utf8,然后再执行,应该就可以了;

这里推荐用libiconv库进行字符集转换。

为什么还要第三步呢?我觉得是客户端传入的字符串的字符集与mysql设置的字符集不匹配,所以就出问题了;

其实在第二步的时候吧utf8改成gb2312也就可以实现了,我觉得这个时候存储是utf8格式,但是传输与显示是gb2312,这里只是我的个人见解;

望大家指正。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
void ShowVideo() { //创建数据库连接 MYSQL mysql; mysql_init(&mysql); mysql_real_connect(&mysql, "localhost", "root", "123456", "database", 3306, NULL, 0); mysql_query(&mysql, "set names utf8"); SOCKET server = socket(AF_INET, SOCK_STREAM, 0);(位于 server2.exe 中)有未经处理的异常: Microsoft C++ 异常: cv::Exception,位于内存位置 0x0000000E76B6DC00 处。 char buffer[2048] = " "; SOCKET sockConn = accept(server, NULL, NULL); Mat videoData; while (true) { int bytes = recv(sockConn, buffer, 2048, 0); if (bytes <= 0) break; // 将接收到的视频数据拼接在一起 videoData.push_back(Mat(1, bytes, CV_8UC1, buffer).clone()); } closesocket(sockConn); //size_t fileSize = 0; std::ofstream videoFile("server_video.avi", std::ios::binary | std::ios::app); while (true) { int bytes = recv(sockConn, buffer, 2048, 0); if (bytes <= 0) break; //fileSize += bytes; // 将接收到的视频数据写入到.avi文件中 //std::ofstream videoFile("server_video.avi", std::ios::binary | std::ios::app); videoFile.write(buffer, bytes); } videoFile.close(); VideoWriter writer("server_video.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 25.0, Size(640, 480)); if (writer.isOpened()) { writer.write(videoData); } //读取视频文件内容并保存到数据库 ifstream fin("server_video.avi", ios::binary | ios::in); if (!fin) { cout << "打开文件失败" << endl; exit(0); } fin.seekg(0, ios::end); int filesize = fin.tellg(); fin.seekg(0, ios::beg); char* fileContent = new char[filesize]; fin.read(fileContent, filesize); string fileContentStr(fileContent, filesize); //将视频内容上传到数据库 string strSql = "INSERT INTO videos(content) VALUES('"+ fileContentStr + "')"; mysql_query(&mysql, strSql.c_str()); delete[] fileContent; fin.close(); //mysql_close(&mysql); /*closesocket(sockConn); closesocket(server); WSACleanup();*/ }
07-15

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值