VSCode连接My SQL ODBC
1.插入操作中解决中文编码
其中插入英文字符正确,中文字符截断
[错误]执行INSERT语句失败: SQLSTATE=42000, 错误码=1064, 信息=[MySQL][ODBC 9.7(w) Driver][mysqld-8.0.45]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '计算机学�?, '共青团员', '软件工程1�?)' at line 1#include<stdio.h>
VSCode源文件编码错误:
(1)打开对应的c文件
(2)点击 VS Code 右下角的编码显示(显示 "UTF-8" 的地方)
(3)选择 "Save with Encoding"
(4)选择 "GBK" 或 "Chinese Simplified (GB2312)"

`#include<stdio.h>
include<stdlib.h>
include<windows.h>
include<sql.h>
include<sqlext.h>
void checkRC(SQLRETURN rc,SQLHANDLE handle,SQLSMALLINT handleType,const char* msg){
if(rc!=SQL_SUCCESS && rc!=SQL_SUCCESS_WITH_INFO){
SQLCHAR sqlState[6],errMsg[256];
SQLINTEGER errCode;
SQLSMALLINT msgLen;
SQLGetDiagRec(handleType,handle,1,sqlState,&errCode,errMsg,sizeof(errMsg),&msgLen);
printf("[错误]%s: SQLSTATE=%s, 错误码=%d, 信息=%s\n",msg,sqlState,errCode,errMsg);
exit(1);
}
}
int main(){
SetConsoleOutputCP(936);
SetConsoleCP(936);
//1.声明ODBC句柄(环境,连接,语句)
SQLHENV envHandle = SQL_NULL_HENV; //环境句柄
SQLHDBC connHandle = SQL_NULL_HDBC; //连接句柄
SQLHSTMT stmtHandle = SQL_NULL_HSTMT; //语句句柄
SQLRETURN rc;
//2.初始化ODBC环境
rc = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&envHandle);
checkRC(rc,envHandle,SQL_HANDLE_ENV,"初始化环境句柄失败");
//设置ODBC版本为3.0
rc = SQLSetEnvAttr(envHandle,SQL_ATTR_ODBC_VERSION,(SQLPOINTER)SQL_OV_ODBC3,0);
checkRC(rc,envHandle,SQL_HANDLE_ENV,"设置ODBC版本失败");
//3,分配连接句柄
rc = SQLAllocHandle(SQL_HANDLE_DBC,envHandle,&connHandle);
checkRC(rc,connHandle,SQL_HANDLE_DBC,"分配连接句柄失败");
//4.连接数据源
SQLCHAR dsn[] = "ST101_ODBC";
SQLCHAR user[] = " ";
SQLCHAR pwd[] = " ";
rc = SQLConnect(connHandle,dsn,SQL_NTS,user,SQL_NTS,pwd,SQL_NTS);
checkRC(rc,connHandle,SQL_HANDLE_DBC,"连接数据源ST101_ODBC失败");
printf("数据库连接成功!\n");
//5.分配语句句柄
rc = SQLAllocHandle(SQL_HANDLE_STMT,connHandle, &stmtHandle);
checkRC(rc,stmtHandle,SQL_HANDLE_STMT,"分配语句句柄失败");
//6.插入数据
SQLCHAR insertSQL[] = "INSERT INTO Student (Sno, Sname, Sage, Ssex, Sdept, Polity, Sclass) VALUES (20210014, '欧五', 20, '男', '计算机学院', '共青团员', '软件工程1班')";
printf("正在插入学生数据...\n");
rc = SQLExecDirect(stmtHandle,insertSQL,SQL_NTS);
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO){
printf("学生数据插入成功!\n");
SQLLEN rowCount;
SQLRowCount(stmtHandle,&rowCount);
printf("影响行数为:%d\n",rowCount);
MessageBox(NULL, "学生数据插入成功!\n请查看数据库确认", "插入成功", MB_OK | MB_ICONINFORMATION);
}else{
printf("学生数据插入失败!\n");
checkRC(rc, stmtHandle, SQL_HANDLE_STMT, "执行INSERT语句失败");
}
//7.释放句柄
if (stmtHandle) {
SQLFreeHandle(SQL_HANDLE_STMT, stmtHandle);
}
SQLDisconnect(connHandle);
SQLFreeHandle(SQL_HANDLE_DBC,connHandle);
SQLFreeHandle(SQL_HANDLE_ENV,envHandle);
printf("程序运行完成!\n");
system("pause");
return 0;
}`
2.终端中文乱码
保持终端编码和程序输出编码一致
SetConsoleOutputCP(936); // 936 是 GBK
SetConsoleCP(936); // 936 是 GBK
3.不要直接Duplicate该文件,UTF-8编码不匹配会乱码,直接copy
浙公网安备 33010602011771号