在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的呈现
vs中的编码设置为gbk,但设置成unicode(utf-8带签名)和unicode(utf-8不带签名)都不行
每次代码执行后都会出现这样的错误:SQLException: Incorrect string value: '\xD4\xC1XAQ6...' for column 'plate_number' at row 1