vs2022无法向mysql插入中文数据该如何解决

82 阅读3分钟

在vs编写代码向mysql表中插入数据时无法为varchar类型字段插入中文数据,插入英文或数字却可以,将mysql的字符集全部调成utf8mb4还是无法解决,希望佬们给给建议。 版本:vs2022 mysql8.3.0

以下这是执行添加车辆函数的代码:

#include <jdbc/cppconn/statement.h>
#include <jdbc/cppconn/resultset.h>
#include <jdbc/cppconn/exception.h>
#include "jdbc/mysql_driver.h"
#include <jdbc/cppconn/prepared_statement.h>  // 提供 sql::PreparedStatement 的定义
#include <jdbc/cppconn/resultset.h>           // 提供 sql::ResultSet 的定义
#include<windows.h>
#include<iostream>
#include"ParkingLotManager.h"
#include<string>
#include"ParkingLotManager.h"
#include"Vehicle.h"
#include<memory>
using namespace std;
void ParkingLotManager::addVehicle(Vehicle& vehicle, sql::Connection* conn) {
    try {
        // 创建一个 Statement 对象用于执行 SQL 语句
        std::unique_ptr<sql::Statement> stmt(conn->createStatement());
 
        int value1 = -1;
        const string value2 = "ok";
        int value3 = vehicle.motorcycle_type == "大型车" ? 1 : 2;
        cout << value3;
        const string value4 = vehicle.motorcycle_type;
        const string value5 = vehicle.plate_number;
 
        string sqlQuery =
            "SELECT site_number "
            "FROM parkingplace "
            "WHERE stairs = ? AND parking_status = 'no' "
            "ORDER BY site_number ASC "
            "LIMIT 1;";
 
        std::unique_ptr<sql::PreparedStatement> prep_stmt(conn->prepareStatement(sqlQuery));
        prep_stmt->setInt(1, value3);
 
        // 调试输出
        cout << "Executing query: " << sqlQuery << " with stairs = " << value3 << endl;
 
        try {
            std::unique_ptr<sql::ResultSet> res(prep_stmt->executeQuery());
             if (res->next()) {                                                                  
                value1 = res->getInt("site_number");
             }
             else {
                cout << "没有空位 (No matching records found)" << endl;
                return;
             }
        }
        catch (sql::SQLException& e) {
            cerr << "SQLException: " << e.what() << endl;
            // 进行错误处理,比如返回错误代码或者重新抛出异常
        }
        //string sql3 = "create trigger trigger_text1 after update on user for each row insert into user_logs values(NULL,now(),concat('有用户信息修改,信息修改之前为:',new.uid,new.username,new.password));";
        // 更新车位状态
       // 更新车位状态
        string sql1 = "UPDATE parkingplace SET site_number = ?,parking_status = ?,plate_number = ?,model = ?,stairs=? "
            "WHERE site_number = ? AND stairs = ?;";
 
        std::unique_ptr<sql::PreparedStatement> update_stmt(conn->prepareStatement(sql1));  // 提前初始化
 
        std::string utf8_plate_number = std::string(vehicle.plate_number.begin(), vehicle.plate_number.end());
        update_stmt->setString(3, utf8_plate_number);  // 现在可以使用它了
 
        update_stmt->setInt(1, value1);
        update_stmt->setString(2, value2);
        update_stmt->setString(3, value5);
        update_stmt->setString(4, value4);
        update_stmt->setInt(5, value3);
        update_stmt->setInt(6, value1);
        update_stmt->setInt(7, value3);
        
        update_stmt->executeUpdate();
        cout << "车位分配成功!" << endl;
    }
    catch (sql::SQLException& e) {
        cerr << "SQLException: " << e.what() << endl;
    }
}

主函数:

#include <jdbc/cppconn/statement.h>
#include <jdbc/cppconn/resultset.h>
#include <jdbc/cppconn/exception.h>
#include "jdbc/mysql_driver.h"
#include<windows.h>
#include<iostream>
#include"Vehicle.h"
#include"ParkingLotManager.h"
#include"ParkingSpot.h"
using namespace std;
int main() {
    try {
        // 注册 MySQL 驱动程序
        sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
        std::unique_ptr<sql::Connection> con(driver->connect("tcp://localhost:3306", "root", "Cj301122@"));
        con->setSchema("parkingsystem");
 
        // 设置字符集(可选)
        con->setClientOption("characterSetResults", "utf8mb4");
        con->setClientOption("characterSetClient", "utf8mb4");
        con->setClientOption("characterSetConnection", "utf8mb4");
        con->setClientOption("characterSetServer", "utf8mb4");
        con->setClientOption("useUnicode", "true");
 
        Vehicle a("粤XAQ693", "大型车");
        ParkingLotManager p;
        p.addVehicle(a, con.get());
    }
    catch (sql::SQLException& sqle) {
        cout << "数据库连接出错!请检查用户名、密码或数据库配置。" << endl;
        cerr << "SQLException: " << sqle.what() << endl;
    }
    return 0;
}

mysql代码

create database if not exists Parkingsystem;
use Parkingsystem;
create table parkingplace(
    site_number int auto_increment,
    parking_status varchar(5),
    stairs int,
    model varchar(10),
    plate_number varchar(10),
    PRIMARY KEY (site_number)
)partition by range(site_number)(
    partition p1 values less than(50),   #大型车
    partition p2 values less than(101)     #中小型车
);
 
ALTER DATABASE parkingsystem CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE parkingplace CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE recording CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE parkingplace CHANGE plate_number plate_number VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE parkingplace CHANGE model model VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE recording CHANGE plate_number plate_number VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE recording CHANGE model model VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

这是parkingplace的呈现

img

vs中的编码设置为gbk,但设置成unicode(utf-8带签名)和unicode(utf-8不带签名)都不行

每次代码执行后都会出现这样的错误:SQLException: Incorrect string value: '\xD4\xC1XAQ6...' for column 'plate_number' at row 1