mysql概念(登录、字符集、存储需求、libmysql开发环境)

1.术语

数据库: : 数据库是一些关联表的集合。
数据表: : 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
列: : 一列(数据元素) 包含了相同的数据, 例如邮政编码的数据。
行: 一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
冗余: 存储两倍数据,冗余降低了性能,但提高了数据的安全性。
主键: 主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
外键: 外键用于关联两个表。
复合键: 复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
索引: 使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列
的值进行排序的一种结构。类似于书籍的目录。
参照完整性: : 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。

2.客户端登录 Mysql

milo@ubuntu:~$ mysql -h127.0.0.1 -uroot -p

-u 表示选择登陆的用户名
-h 表示要连接的主机
-p 表示登陆的用户密码

3.一些命令

1.show databases 查看当前的数据库

2. use mysql选择 mysql 数据库

3. show tables 查看当前选中数据库中所有表

4. 允许外面用户访问mysql

1)Mysql 安装后,默认只允许本机访问 Mysql。

use mysql
select user, host from user;
#update 修改其中某一条记录的 host 字段值为'%',或者新增一条记录且 host 字段值为'%'
update user set host='%' where user='lingsheng_test';
select user, host from user;
#显示下面的图片

在这里插入图片描述
在这里插入图片描述
2)如果上面两种情况都不存在或不能解决,可以使用 netstat 命令查看 mysql 服务绑定的 ip,如果绑定的是 127.0.0.1,则外部机器也不能访问 mysql。可以通过修改 Mysql 配置文件解决。以 Ubuntu 系统为例,使用 apt-get 方式安装的 Mysql,配置文件默认位置通常是
/etc/mysql/mysql.conf.d/mysqld.cnf
使用下面命令编辑该文件

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

注释掉以下一行即可:
bind-address = 127.0.0.1
3)若是 防火墙原因(如果是云服务器需要查看)
4)mysql重启

sudo/etc/init.d/mysql restart

4.mysql字符集

1.查看字符集

  1. 显示 MYSQL 字符集编码
    show variables like ‘charact%’;
  2. 查看 MySQL 数据库服务器和数据库字符集
    show variables like ‘%char%’;
  3. 查看当前安装的 MySQL 所支持的字符集
    show charset;
    4)查看数据库编码:
    SHOW CREATE DATABASE db_name;
  4. 查看表编码:
    SHOW CREATE TABLE tbl_name;
  5. 查看字段编码:
    SHOW FULL COLUMNS FROM tbl_name;
  6. 查看系统的编码字符:
    SHOW VARIABLES WHERE Variable_name LIKE ‘character_set_%’ OR Variable_name LIKE ‘collation%’;
  7. 设置编码
    在 mysqld.cnf 添加如下内容, 保存,重启 mysql 即可;
    在这里插入图片描述

2.MySQL 创建设置字符集和修改字符集

1)创建数据库指定数据库的字符集
CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
2)创建表时指定字符集
CREATE TABLE table_name (id int unsigned) DEFAULT CHARACTER SET utf8 COLLATEutf8_general_ci;
3)创建字段时指定字符集
CREATE TABLE table_name2 (id int,name char(10) CHARACTER SET utf8 COLLATE utf8_general_ci);
4)修改 数据库字符集
ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE …];
5)把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE …]
例如:
ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
5)只是修改 表的默认字符集
ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE…];
例如
ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
6)修改 字段的字符集
ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE…];
例如
ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci;

3.MySQL 字符集转换过程

1) MySQL Server 收到请求时将请求数据从 character_set_client 转换为
character_set_connection;
2)进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集,
其确定方法如下:
使用每个数据字段的 CHARACTER SET 设定值;
若上述值不存在,则使用对应数据表的 DEFAULT CHARACTER SET 设定值(MySQL 扩展,非 SQL 标准);
若上述值不存在,则使用对应数据库的 DEFAULTCHARACTER SET 设定值;
若上述值不存在,则使用 character_set_server 设定值。
3) 将操作结果从内部操作字符集转换为 character_set_results。

4.MySQL 默认字符集

传统的程序在创建数据库和数据表时并没有使用那么复杂的配置,它们用的是默认的配
置,那么,默认的配置从何而来呢?
1)编译 MySQL 时,指定了一个默认的字符集,这个字符集是 latin1;(Latin1 是 ISO-8859-1的别名,有些环境下写作 Latin-1。)
2)安装 MySQL 时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
3)启动 mysqld 时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时 character_set_server 被设定为这个默认的字符集;
4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为
character_set_server;
5)当选定了一个数据库时,character_set_database 被设定为这个数据库默认的字符集;
6)在这个数据库里创建一张表时,表默认的字符集被设定为 character_set_database,也就是这个数据库默认的字符集;
7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;

5.UTF8 和 和 4 UTF8mb4 的区别

在这里插入图片描述
1.MySQL 在 5.5.3 之后增加了这个 utf8mb4 的编码,mb4 就是 most bytes 4 的意思,
专门用来兼容四字节的 unicode。好在utf8mb4 是 utf8 的超集,除了将编码改为 utf8mb4
外不需要做其他转换。当然,为了节省空间,一般情况下使用 utf8 也就够了
2.既然 utf8 能够存下大部分中文汉字,那为什么还要使用 utf8mb4 呢? 原来 mysql 支持
的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了
。三个
字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文
种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode 字符,都无法使用 Mysql
的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios
和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等(utf8 的
缺点)。
在这里插入图片描述
3)建议存储有中文的使用 utf8mb4。

6.乱码解决方案

  1. 首先要明确你的客户端时候何种编码格式,这是最重要的(IE6 一般用 utf8,命令行一般是 gbk,一般程序是 gb2312)
    2)确保你的数据库使用 utf8 格式,所有编码通吃。
    3)一定要保证 connection 字符集大于等于 client 字符集,不然就会信息丢失,比如:
    latin1 < gb2312 < gbk < utf8,若设置 set character_set_client = gb2312,那么
    至少 connection 的字符集要大于等于 gb2312,否则就会丢失信息
    4)以上三步做正确的话,那么所有中文都被正确地转换成 utf8 格式存储进了数据库,为
    了适应不同的浏览器,不同的客户端,你可以修改 character_set_results 来以不同的编
    码显示中文字体,由于 utf8 是大方向,因此 web 应用是我还是倾向于使用 utf8 格式显示
    中文的。

5.mysql存储需求

1)数值类型存储需求

列类型 存储需求
TINYINT 1 个字节
SMALLINT 2 个字节
MEDIUMINT 3 个字节
INT, INTEGER 4 个字节
BIGINT 8 个字节
FLOAT§ 如果 0 <= p <= 24 为 4 个字节, 如果 25 <= p <= 53 为 8
个字节
FLOAT 4 个字节
DOUBLE [PRECISION], item REAL 4 个字节
DECIMAL(M,D), NUMERIC(M,D) 变长(0-4 个字节)
BIT(M) 大约(M+7)/8 个字节
int(10) 这里的 10 指的是数值的宽度,并不是字节

2)日期和时间类型的存储需求

列类型 存储需求
DATE 3 个字节
DATETIME 8 个字节
TIMESTAMP 4 个字节
TIME 3 个字节
YEAR 1 个字节

3)字符串类型的存储需求

列类型 存储需求
CHAR(M) M 个字节,0 <= M <= 255
VARCHAR(M) L+1 个字节,其中 L <= M 且 0 <= M <= 65535
BINARY(M) M 个字节,0 <= M <= 255
VARBINARY(M) L+1 个字节,其中 L <= M 且 0 <= M <= 255
TINYBLOB, TINYTEXT L+1 个字节,其中 L < 28
BLOB, TEXT L+2 个字节,其中 L < 216
MEDIUMBLOB, MEDIUMTEXT L+3 个字节,其中 L < 224
LONGBLOB, LONGTEXT L+4 个字节,其中 L < 232
ENUM(‘value1’,’value2’,…) 1 或 2 个字节,取决于枚举值的个数(最多 65,535 个值)
SET(‘value1’,’value2’,…) 1、2、3、4 或者 8 个字节,取决于 set 成员的数目(最
多 64 个成员)

上表的 M 只是为了说明占用空间大小,在实际创建表中 char(20)、varchar(20),20 指的是字符而不是字节(4.0 版本以上,以下指的是字节);那么字符和字节的转换要看字符集,utf-8下,1 字符=3 字节;gbk 下,1 字符=2 字节。

6.libmysql 的开发环境

编译代码的时候需要链接 mysql 的库,可以通过如下方式编译
g++ -Wall mysql_test.cpp -o mysql_test -lmsqlclient
(缺少 libmysqlclient-dev,使用下面命令安装就可以。)
sudo apt-get install libmysqlclient-dev

1)函数原型

1. MYSQL *mysql_init(MYSQL *mysql)

mysql: 有两种情况,一般都采用第⑴种方法.
⑴参数传 NULL 值。
这种情况很显然,是 mysql_init() 函数内部申请了一片内存,然后返回了首
地址。
MYSQL *ms_conn = mysql_init(NULL);
用完记得要释放
mysql_close(ms_conn), ms_conn = NULL;
⑵参数传对象地址。
这种情况就是使用栈内存,mysql_init() 函数显然不应该给分配堆内存。
MYSQL ms_eg;
MYSQL *ms_conn = mysql_init(&ms_eg);
用完记得要释放
mysql_close(ms_conn), ms_conn = NULL;

2. 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_real_connect()尝试与运行在主机上的 MySQL 数据库引擎建立连接。在你能够 执 行 需 要 有 效 MySQL 连 接 句 柄 结 构 的 任 何 其 他 API 函 数 之 前 ,mysql_real_connect()必须成功完成

参数:

a) mysql: MYSQL 结构的地址。调用 mysql_real_connect()之前,必须调用
mysql_init()来初始化 MYSQL 结构。
b) host: 必须是主机名或 IP 地址。如果“host”是 NULL 或字符串"localhost",连
接将被视为与本地主机的连接。
c) passwd: 用户的密码。如果“passwd”是 NULL,仅会对该用户的(拥有 1 个空密
码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的
方式设置 MySQL 权限系统,根据用户是否拥有指定的密码,用户将获得不同
的权限。
d) db: 数据库名称。如果 db 为 NULL,连接会将默认的数据库设为该值。
e) port: 如果“port”不是 0,其值将用作 TCP/IP 连接的端口号。注意,“host”
参数决定了连接的类型。
f) unix_socket: 如果 unix_socket 不是 NULL,该字符串描述了应使用的套接字或命
名管道。注意,“host”参数决定了连接的类型。
g) client_flag: 通常为 0,但是,也能将其设置为下述标志的组合,以允许特定功
能:

在这里插入图片描述
返回值
如果连接成功,返回 MYSQL*连接句柄。如果连接失败,返回 NULL。对于成功的连
接,返回值与第 1 个参数的值相同。
错误
CR_CONN_HOST_ERROR
无法连接到 MySQL 服务器。
CR_CONNECTION_ERROR
无法连接到本地 MySQL 服务器。
CR_IPSOCK_ERROR
无法创建 IP 套接字。
CR_OUT_OF_MEMORY
内存溢出。
CR_SOCKET_CREATE_ERROR
无法创建 Unix 套接字。
CR_UNKNOWN_HOST
无法找到主机名的 IP 地址。
CR_VERSION_ERROR
协议不匹配,起因于:试图连接到具有特定客户端库(该客户端库使用了不同
的协议版本)的服务器。如果使用很早的客户端库来建立与较新的服务器(未
使用“–old-protocol”选项开始的)的连接,就会出现该情况。
CR_NAMEDPIPEOPEN_ERROR
无法在 Windows 平台下创建命名管道。
CR_NAMEDPIPEWAIT_ERROR
在 Windows 平台下等待命名管道失败。
CR_NAMEDPIPESETSTATE_ERROR
在 Windows 平台下获取管道处理程序失败。
CR_SERVER_LOST
如果 connect_timeout> 0,而且在连接服务器时所用时间长于 connect_timeout
秒,或在执行 init-command 时服务器消失。

3. int mysql_query(MYSQL *mysql, const char *stmt_str)

作用
mysql_query() 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条
查询,如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的
连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。
查询结果会被缓存。
参数
mysql: mysql_init 函数返回的指针。
stmt_str: 查询语句。
返回值
成功返回 0, 如果发生错误返回非 0.
错误
CR_COMMANDS_OUT_OF_SYNC
命令的执行顺序不正确。
CR_SERVER_GONE_ERROR
MySQL 服务器已经消失了。
CR_SERVER_LOST
查询期间与服务器的连接丢失。
CR_UNKNOWN_ERROR
发生未知错误。

4. MYSQL_RES *mysql_use_result(MYSQL *mysql)

作用
对于成功检索数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN),必须调用 mysql_store_result()或 mysql_use_result()。mysql_use_result()将初始化结果 集检索,但并不像 mysql_store_result()那样将结果集实际读取到客户端。它必须通过对 mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与 mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到 max_allowed_packet 字节。
参数
mysql: mysql_init 函数返回的指针。
返回值
MYSQL_RES 结果结构。如果出现错误,返回 NULL。

5. MYSQL_RES *mysql_store_result(MYSQL *mysql)

作用
对于成功检索了数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用 mysql_store_result()或 mysql_use_result() 。对于其他查询,不需要调用 mysql_store_result()或 mysql_use_result(),但是如果在任何情况下均调用了mysql_store_result() , 它 也 不 会 导 致 任 何 伤 害 或 性 能 降 低 。 通 过 检 查mysql_store_result()是否返回 0,可检测查询是否没有结果集(以后会更多)。如果希望了解查询是否应返回结果集,可使用 mysql_field_count()进行检查“mysql_field_count()”。mysql_store_result()将查询的全部结果读取到客户端,分配 1 个 MYSQL_RES 结构,并将结果置于该结构中。如果查询未返回结果集,mysql_store_result()将返回 Null 指针(例如,如果查询是 INSERT 语句)。如果读取结果集失败,mysql_store_result()还会返回 Null 指针。通过检查 mysql_error()是否返回非空字符串,mysql_errno()是否返回非 0 值,或mysql_field_count()是否返回 0,可以检查是否出现了错误。如果未返回行,将返回
空的结果集。(空结果集设置不同于作为返回值的空指针)。一旦调用mysql_store_result()并获得了不是 Null 指针的结果,可调用 mysql_num_rows()来找
出结果集中的行数。可以调用 mysql_fetch_row()来获取结果集中的行,或调用 mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。一旦完成了对结果集的操作,必须调用 mysql_free_result()
参数
mysql: mysql_init 函数返回的指针。
返回值
具有多个结果的 MYSQL_RES 结果集合。如果出现错误,返回 NULL。

6. 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)给出。如果 row 保存了从一个对用
mysql_fetch_row() 调 用 返 回 的 值 , 指 向 该 值 的 指 针 作 为 row[0] 到
row[mysql_num_fields(result)-1]来存取。在行中的 NULL 值由 NULL 指针指出。
在行中字段值的长度可以通过调用 mysql_fetch_lengths()获得。空字段和包含 NULL
的字段长度都是 0;你可以通过检查该值的指针区分他们。如果指针是 NULL,字
段是 NULL;否则字段是空的。
参数
result: 返回一个结构为MYSQL_ROW的下一行结果, 如果没有要检索的行或发生错
误,则返回 NULL。
返回值
返回一个结构为 MYSQL_ROW 的下一行结果, 如果没有要检索的行或发生错
误,则返回 NULL。
错误
调用 mysql fetch_row()之间不会重置错误
CR_SERVER_LOST
查询期间与服务器的连接丢失。
CR_UNKNOWN_ERROR
发生未知错误。

7. void mysql_free_result(MYSQL_RES *result)

作用
释放由 mysql_store_result(), mysql_use_result(), mysql_list_dbs()等为结果集分配的
内存。使用完结果集后,必须通过调用 mysql_free_result()释放它使用的内存。
释放结果集后不要尝试访问该结果集。
参数
result: 结果集
返回值

8. void mysql_close(MYSQL *mysql);

作用
关闭以前打开的连接。如果处理程序是由 mysql_init()或 mysql_connect()自动分配
的,mysql_close()还会释放 mysql 指向的连接处理程序。
参数
mysql: mysql_init 函数返回的指针。
返回值

2)环境安装

apt-get install libmysqlclient-dev

然后再/usr/include/mysql/目录下的 mysql.h 是主要的 API 接口头文件
在这里插入图片描述

3)数据结构原型

MYSQL : mysql 数据库连接句柄。在执行任何数据库操作之前首先就需要创建一个
MYSQL 结构。
MYSQL_RES : 执行查询语句(SELECT, SHOW, DESCRIBE, EXPLAIN)返回的结果。
MYSQL_ROW : 用来表示返回结果中的一行数据。由于每行数据格式不一致,因此使用此
结构来统一表示。调用 mysql_fetch_row()可从 MYSQL_RES 中返回一个
MYSQL_ROW 结构。
MYSQL_FIELD: 用来表示一个 field 信息的元数据(元数据,即描述数据的数据),包括
field name,field type 以及 field size 等。MYSQL_FIELD 不包含 field 的值
(MYSQL_ROW 真正保存各 field 的值)。
MYSQL_FIELD_OFFSET: field 在 row 中的索引值,从 0 开始。

typedef struct st_mysql {
	NET net; //通讯参数,网络相关
	gptr connector_fd; //加密套接字协议层
	//主机名, 数据库用户名,密码,Unix 套接字,版本,主机信息
	char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info,*db;
	unsigned int port,client_flag,server_capabilities;
	unsigned int protocol_version;
	unsigned int field_count; //字段个数
	unsigned int server_status; //数据库状态
	unsigned long thread_id; //数据库服务器中的连接 ID
	my_ulonglong affected_rows;
	my_ulonglong insert_id; //下一条记录的 ID
	my_ulonglong extra_info;
	unsigned long packet_length;
	enum mysql_status status;
	MYSQL_FIELD *fields; //字段列表
	MEM_ROOT field_alloc;
	my_bool free_me; //是否关闭
	my_bool reconnect; //是否自动连接
	struct st_mysql_options options;
	char scramble_buff[9];
	struct charset_info_st *charset;
	unsigned int server_language; //数据库语言
} MYSQL; //MYSQL 句柄
typedef struct st_mysql_res
{
	my_ulonglong row_count; // 结果集的行数
	unsigned int field_count, current_field;// 结果集的列数,当前列
	MYSQL_FIELD *fields; // 结果集的列信息
	MYSQL_DATA *data; // 结果集的数据
	MYSQL_ROWS *data_cursor; // 结果集的光标
	MEM_ROOT field_alloc; // 内存结构
	MYSQL_ROW row; // 非缓冲的时候用到
	MYSQL_ROW current_row; // mysql_store_result 时会用到,当前行
	unsigned long *lengths; // 每列的长度
	MYSQL *handle; // mysql_use_result 会用。
	my_bool eof; // 是否为行尾
} MYSQL_RES; //查询结果集
typedef char **MYSQL_ROW; // 以字符串数组的形式返回数据
typedef unsigned int MYSQL_FIELD_OFFSET; // 当前字段的偏移量量
typedef struct st_mysql_rows
{
	struct st_mysql_rows *next; // 下一条记录
	MYSQL_ROW data; // 当前行的数据
	unsigned long length; // 数据的长度
} MYSQL_ROWS; //mysql 的数据的链表节点。可见 mysql 的结果集是链表结构
typedef struct st_mysql_data
{
	my_ulonglong rows;
	unsigned int fields;
	MYSQL_ROWS *data;
	MEM_ROOT alloc;
} MYSQL_DATA; // 数据集的结构
typedef struct st_mysql_field
{
	char *name; //列名称
	char *table; //如果列是字段,列表
	char *def; //默认值(由 mysql_list_fields 设置)
	enum enum_field_types type; //类型的字段。Se mysql_com。h 的类型
	unsigned int length; //列的宽度
	unsigned int max_length; //选择集的最大宽度
	unsigned int flags; //div 标记集
	unsigned int decimals; //字段中的小数位数
} MYSQL_FIELD; //列信息的结构
typedef struct st_used_mem //结构为 once_alloc
{
	struct st_used_mem *next; //下一个块使用
	unsigned int left; //记忆留在块
	unsigned int size; //块的大小
} USED_MEM; //内存结构
typedef struct st_mem_root
{
	USED_MEM *free;
	USED_MEM *used;
	USED_MEM *pre_alloc;
	unsigned int min_malloc;
	unsigned int block_size;
	void (*error_handler)(void);
} MEM_ROOT; //内存结构

4)示例代码

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
	MYSQL *conn;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char server[] = "localhost";
	char user[] = "lingsheng_mysql";
	char password[] = "lingsheng";
	char database[] = "mysql";
	conn = mysql_init(NULL);
	if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0))
	{
		fprintf(stderr, "%s\n", mysql_error(conn));
		exit(1);
	}
	if (mysql_query(conn, "show tables"))
	{
		fprintf(stderr, "%s\n", mysql_error(conn));
		exit(1);
	}
	res = mysql_use_result(conn);
	printf("MySQL Tables in mysql database:\n");
	while ((row = mysql_fetch_row(res)) != NULL)
	{
		printf("%s \n", row[0]);
	}
	mysql_free_result(res);
	mysql_close(conn);
	printf("finish! \n");
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值