MySQL
1、MySQL命令行使用
①登录
MySQL8.x是默认安装到/usr/local/myslq/bin目录下,安装过程中已设置密码,执行如下命令登录MySQL
./mysql -u root -p
mysql>
②显示数据库
mysql>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
③创建数据库
创建名为UserDB的数据库
mysql> create database UserDB;
④删除数据库
删除数据库UserDB
mysql> drop database UserDB;
⑤使用数据库
使用数据库tbl_userinfo
mysql> use UserDB;
Database changed
⑥查看数据库中的表
mysql>show tables;
Empty set (0.00 sec)
⑦创建数据库表
需要在第五步use之后使用如下命令创建数据库表
mysql> create table tbl_userinfo (name varchar(20), sex char(1), birth date, birthaddr varchar(20));
Query OK, 0 rows affected (0.01 sec)
创建name为主键的表
create table tbl_userinfo2 (name varchar(20), sex char(1), birth date, birthaddr varchar(20), primary key(name));
⑧插入数据库表
mysql> insert into tbl_userinfo value('abc', 'f', '1999-01-01', 'china');
Query OK, 1 row affected (0.01 sec)
⑨查询数据库表
mysql> select * from tbl_userinfo;
+------+------+------------+-----------+
| name | sex | birth | birthaddr |
+------+------+------------+-----------+
| abc | f | 1999-01-01 | china |
| ddd | f | 1999-01-01 | China |
+------+------+------------+-----------+
2 rows in set (0.00 sec)
查询名字为abc的那一行
mysql> select name, birth from tbl_userinfo where name='abc' and birth='1999-01-01';
+------+------------+
| name | birth |
+------+------------+
| abc | 1999-01-01 |
+------+------------+
1 row in set (0.00 sec)
只查询两列
mysql> select name, birth from tbl_userinfo;
+------+------------+
| name | birth |
+------+------------+
| abc | 1999-01-01 |
| ddd | 1999-01-01 |
+------+------------+
2 rows in set (0.00 sec)
⑩更改数据库表
mysql> update tbl_userinfo set sex='m' where name='abc';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from tbl_userinfo;
+------+------+------------+-----------+
| name | sex | birth | birthaddr |
+------+------+------------+-----------+
| abc | m | 1999-01-01 | china |
| ddd | f | 1999-01-01 | China |
+------+------+------------+-----------+
2 rows in set (0.00 sec)
11.删除数据库表中的某一项
mysql> delete from tbl_userinfo where name='ddd';
Query OK, 1 row affected (0.00 sec)
mysql> select * from tbl_userinfo;
+------+------+------------+-----------+
| name | sex | birth | birthaddr |
+------+------+------------+-----------+
| abc | m | 1999-01-01 | china |
+------+------+------------+-----------+
1 row in set (0.00 sec)
12.删除数据库表
mysql> drop table tbl_userinfo;
Query OK, 0 rows affected (0.00 sec)
mysql> show tables;
Empty set (0.01 sec)
2、MySQL C API
使用MySQL的CMakeLists.txt的配置
先复制这两个动态库到/usr/local/lib目录下
sudo cp /usr/local/mysql/lib/libssl.1.1.dylib /usr/local/lib
sudo cp /usr/local/mysql/lib/libcrypto.1.1.dylib /usr/local/lib
编写CMakeLists.txt
set(CMAKE_CXX_STANDARD 11)
set(MYSQL_HEADER /usr/local/mysql/include)
set(MYSQL_LIB /usr/local/mysql/lib)
# 添加 MySQL 连接头⽂件
include_directories(${MYSQL_HEADER})
# 添加 MySQL 外部库
link_libraries(${MYSQL_LIB})
add_executable(untitled main.cpp)
target_link_libraries(untitled ${MYSQL_LIB}/libmysqlclient.a)
target_link_libraries(untitled ${MYSQL_LIB}/libmysqlservices.a)
target_link_libraries(untitled ${MYSQL_LIB}/libssl.1.1.dylib)
target_link_libraries(untitled ${MYSQL_LIB}/libcrypto.1.1.dylib)
2.1.初始化函数
MYSQL *mysql_init(MYSQL *mysql);
mysql 可以传 NULL
返回值:mysql句柄
2.2设置连接选项配置
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)
描述:可用于设置额外的连接选项,并影响连接的行为。可多次调用该函数来设置数个选项。
应在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。
选项参量指的是你打算设置的选项。Arg参量是选项的值。如果选项是整数,那么arg应指向整数的值。
如:
mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect);配合mysql_ping实现自动重连
mysql_options(m_mysql, MYSQL_SET_CHARSET_NAME, "utf8mb4");//编码设置
2.3连接数据库
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *passwd, const char *db, unsigned int port,
const char *unix_socket, unsigned long client_flag)
参数介绍
mysql 初始化的句柄指针 host 主机地址 user 用户名 – mysql数据库 root passwd 用户的密码 db 要连接的数据库 port 端口 一般填0,mysql默认端口 3306 unix_socket 本地套接字 ,一般填NULL client_flag 连接标志 一般填0 返回值:成功返回 连接句柄,失败返回 NULL
2.4释放连接资源
mysql_close(MYSQY* conn);
释放连接资源
2.5数据库操作
int mysql_query(MYSQL *mysql, const char *query)
其实还有一个函数:mysql_real_query
,这个函数多了一个unsigned long的参数,可以包含二进制数据,mysql_quert中的query参数遇到\0
就回自动截断,而mysql_real_query中不会
参数介绍:
mysql 连接句柄
query 执行的sql
返回值:
成功 返回 0
失败 返回 非0
2.6获得结果集的函数
MYSQL_RES *mysql_store_result(MYSQL *mysql)
,还有一个函数:mysql_use_result(MYSQL *mysql)
mysql_use_result调用后会立即返回,而mysql_store_result会存储返回的结果,时间可能比较长,默认最大为64MB
执行mysql_query后必须执行mysql_store_result或mysql_use_result
返回值: 如果读取结果集失败,mysql_store_result()还会返回Null指针。
通过检查 mysql_error(MYSQL *mysql)
是否返回非空字符串,mysql_errno(MYSQL *mysql)
是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如:
MYSQL_RES* res = mysql_store_result(m_mysql);
2.7释放结果集
void mysql_free_result(MYSQL_RES *result)
如:
mysql_free_result(m_res);
m_res = NULL;
2.8取出一行信息
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
描述
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
行内值的数目由mysql_num_fields(result)给出。如果行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。
可以通过调用mysql_fetch_lengths()来获得行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。通过检查字段值的指针,能够区分它们。如果指针为NULL,字段为NULL,否则字段为空。
返回值
下一行的MYSQL_ROW结构。如果没有更多要检索的行或出现了错误,返回NULL。
2.9.获取查询的显示列的长度
unsigned int mysql_num_fields(MYSQL_RES *result)
描述:返回结果集中的列数。
注意,你可以从指向结果集的指针或指向连接句柄的指针获得行数。如果mysql_store_result()或mysql_use_result()返回NULL,应使用连接句柄(因而没有结果集指针)。在该情况下,可调用mysql_field_count()来判断mysql_store_result()是否生成了非空结果。这样,客户端程序就能采取恰当的行动,而不需要知道查询是否是SELECT语句(或类似SELECT的语句)。在下面的示例中,介绍了执行该操作的方式。
行数直接判断MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)是否为空
如:
int num_fields = mysql_num_fields(m_res);
2.10.获取列信息
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)
描述
返回采用MYSQL_FIELD结构的结果集的列。重复调用该函数,以检索关于结果集中所有列的信息。未剩余字段时,mysql_fetch_field()返回NULL。
每次执行新的SELECT查询时,将复位mysql_fetch_field(),以返回关于第1个字段的信息。调用mysql_field_seek()也会影响mysql_fetch_field()返回的字段。
如果调用了mysql_query()以在表上执行SELECT,但未调用mysql_store_result(),如果调用了mysql_fetch_field()以请求BLOB字段的长度,MySQL将返回默认的Blob长度(8KB)。之所以选择8KB是因为MySQL不知道BLOB的最大长度。应在日后使其成为可配置的。一旦检索了结果集,field->max_length将包含特定查询中该列的最大值的长度。
返回值
当前列的MYSQL_FIELD结构。如果未剩余任何列,返回NULL。
3、使用的一个小例子
先复制动态库
sudo cp /usr/local/mysql/lib/libssl.1.1.dylib /usr/local/lib
sudo cp /usr/local/mysql/lib/libcrypto.1.1.dylib /usr/local/lib
main.cpp
#include<iostream>
#include<mysql.h>
#include <sstream>
using namespace std;
const char host[] = "127.0.0.1";
const char user[] = "root";
const char pwd[] = "xxxxxxx"; // 密码
const char database[] = "UserDB";
unsigned int port = 3306;
int main() {
MYSQL myCont;
mysql_init(&myCont);
if (mysql_real_connect(&myCont, host, user, pwd, database, port, nullptr, 0)) {
cout << "Hello MySQL" << endl;
} else {
cout << "connect failed!" << endl;
}
string str = "select * from tbl_userinfo";
mysql_query(&myCont, str.c_str());
MYSQL_RES *res = mysql_store_result(&myCont); // 只能获取select的返回值,insert等是不行的
if (!res) {
cout << "mysql_store_result faied!" << mysql_error(&myCont) << endl;
}
cout << mysql_error(&myCont) << endl;
MYSQL_ROW row;
row = mysql_fetch_row(res);
while (row) {
unsigned long *lens = mysql_fetch_lengths(res);
cout << lens[0] << endl;
cout << row[0] << "---" << row[1] << endl;
row = mysql_fetch_row(res);
}
mysql_free_result(res);
mysql_close(&myCont);
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(untitled)
set(CMAKE_CXX_STANDARD 11)
set(MYSQL_HEADER /usr/local/mysql/include)
set(MYSQL_LIB /usr/local/mysql/lib)
# 添加 MySQL 连接头⽂件
include_directories(${MYSQL_HEADER})
# 添加 MySQL 外部库
link_libraries(${MYSQL_LIB})
add_executable(untitled main.cpp)
target_link_libraries(untitled ${MYSQL_LIB}/libmysqlclient.a)
target_link_libraries(untitled ${MYSQL_LIB}/libmysqlservices.a)
target_link_libraries(untitled ${MYSQL_LIB}/libssl.1.1.dylib)
target_link_libraries(untitled ${MYSQL_LIB}/libcrypto.1.1.dylib)
作者: mengchao
出处:https://www.cnblogs.com/meng-chao/p/16298414.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)