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, nullptr0)) {
        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)
posted @ 2022-05-22 17:25  mengchao  阅读(31)  评论(0编辑  收藏  举报