https://yq.aliyun.com/ziliao/140874
1. MySQL的安装与配置:
在Ubuntu下安装MySQL方法很简单,使用如下命令:
sudo apt-get install mysql-server
安装的过程中系统会提示设置root密码,此过程可以跳过,但是建议在安装时提示设置root密码的时候自行设置,免得后面设置麻烦。安装结束之后,系统会启动mysql服务,可以使用命令去查看来验证mysql服务是否已经安装成功:
ps -el | grep mysql
如果mysql服务没有正常的运行,可以使用下面指令对mysql服务进行重启:
sudo service mysql restart
喜欢使用Workbench界面的,还需要安装Workbench:
sudo apt-get install mysql-workbench
Workbench的启动使用如下命令:
mysql-workbench --log-level=debug3 --verbose
2. MySQL命令行:
我们使用root去登录MySQL,然后做相关的操作:
在此,系统会提示输入密码,只需要输入之前设置的MySQL密码即可,然后程序会进入mysql命令行模式下,假设我们需要查看user信息,我们使用如下命令:
use mysql
SELECT host, user, password FROM user;
MySQL会返回所有host,user和password等信息。其他比较复杂的操作,诸如添加数据库,添加表等和普通的数据操作命令一致,后面会以一个实例来说明。让我们赶快进入Linux下C操作MySQL的实践吧!
3. 使用C语言管理MySQL数据库:
首先,我们需要安装在Linux下操作MySQL多依赖的库,安装命令如下:
sudo apt-get install libmysqlclient-dev
安装了这个之后,我们编程所需要的头文件,库文件等就齐全了,让我们开始C编程之旅吧!
首先,让我们准备一个我们用来折腾的空间,也就是准备一个折腾专属账户,一个折腾专属数据库和数据表等:
#添加账户
GRANT ALL ON *.* TO rick@localhost IDENTIFIED BY 'secret'
\q
#使用新创建的rick账户登录
mysql -u rick -p
#创建数据库
CREATE DATABASE foo;
然后,我们使用一个sql文件插入数据表和测试数据:
--
-- Create the table children
--
CREATE TABLE children (
childno int(11) NOT NULL auto_increment,
fname varchar(30),
age int(11),
PRIMARY KEY (childno)
);
--
-- Populate the table 'children'
--
INSERT INTO children(childno, fname, age) VALUES (1, 'Jenny', 21);
INSERT INTO children(childno, fname, age) VALUES (2, 'Andrew', 17);
INSERT INTO children(childno, fname, age) VALUES (3, 'Gavin', 8);
INSERT INTO children(childno, fname, age) VALUES (4, 'Duncan', 6);
INSERT INTO children(childno, fname, age) VALUES (5, 'Emma', 4);
INSERT INTO children(childno, fname, age) VALUES (6, 'Alex', 15);
INSERT INTO children(childno, fname, age) VALUES (7, 'Adrian', 9);
--
-- Create the table children
--
CREATE TABLE children (
childno int(11) NOT NULL auto_increment,
fname varchar(30),
age int(11),
PRIMARY KEY (childno)
);
--
-- Populate the table 'children'
--
INSERT INTO children(childno, fname, age) VALUES (1, 'Jenny', 21);
INSERT INTO children(childno, fname, age) VALUES (2, 'Andrew', 17);
INSERT INTO children(childno, fname, age) VALUES (3, 'Gavin', 8);
INSERT INTO children(childno, fname, age) VALUES (4, 'Duncan', 6);
INSERT INTO children(childno, fname, age) VALUES (5, 'Emma', 4);
INSERT INTO children(childno, fname, age) VALUES (6, 'Alex', 15);
INSERT INTO children(childno, fname, age) VALUES (7, 'Adrian', 9);
将上述sql语句存为create_children.sql,然后使用下列命令导入MySQL数据库foo:
mysql -u rick --password=secret foo
\. create_children.sql
好了,写个demo进行测试吧:
#include <stdlib.h>
#include <stdio.h>
#include "mysql.h"
int main(int argc, char *argv[]) {
MYSQL my_connection;
int res;
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost",
"rick", "secret", "foo", 0, NULL, 0)) {
printf("Connection success\n");
res = mysql_query(&my_connection, "INSERT INTO children(fname, age) VALUES('Ann', 3)");
if (!res) {
printf("Inserted %lu rows\n",
(unsigned long)mysql_affected_rows(&my_connection));
} else {
fprintf(stderr, "Insert error %d: %s\n", mysql_errno(&my_connection), mysql_error(&my_connection));
}
mysql_close(&my_connection);
} else {
fprintf(stderr, "Connection failed\n");
if (mysql_error(&my_connection)) {
fprintf(stderr, "Connection error %d: %s\n", mysql_errno(&my_connection), mysql_error(&my_connection));
}
}
return EXIT_SUCCESS;
}
将上述代码保存为demo.c。上述代码中,我们需要包含mysql.h头文件来使用mysql提供的API对MySQL进行操作。程序写好了,编译过程需要加入需要的链接信息:
gcc -I/usr/include/mysql demo.c -L/usr/lib/mysql -lmysqlclient -o demo
好了,程序成功编译,运行一下试试吧:
./demo
#结果如下
Connection success
Inserted 1 rows
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言操作数据库 , linux安装mysql c语言连接mysql c语言操作mysql数据库、c语言连接mysql数据库、c语言mysql数据库、c语言查询mysql数据库、c语言调用mysql数据库,以便于您获取更多的相关知识。
http://blog.csdn.net/helplee601276804/article/details/39694515
1 概述
MySQL 是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是最流行的关系型数据库管理系统。
支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。 为多种编程语言提供了API。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和Tcl等。
2 安装mysql
2.1 通过网络安装mysql
2.1.1 检查是否已经安装mysql
# rpm -qa | grep mysql
// 上述命令就会查看该操作系统上是否已经安装了mysql数据库
有的话,我们就通过 rpm -e 命令 或者 rpm -e --nodeps 命令来卸载掉
#rpm -e --nodeps mysql
在删除完以后我们可以通过 rpm -qa | grep mysql 命令来查看mysql是否已经卸载成功!!
2.1.2 通过yum来进行mysql的安装
#yum install -y mysql-server mysql mysql-deve
通过输入 yum install -y mysql-server mysql mysql-devel 命令将mysql mysql-server mysql-devel都安装好(注意:安装mysql时我们并不是安装了mysql客户端就相当于安装好了mysql数据库了,我们还需要安装mysql-server服务端才行)
通过yum方式安装mysql数据库省去了很多没必要的麻烦,当出现下面的结果时,就代表mysql数据库安装成功了
此时我们可以通过如下命令,查看刚安装好的mysql-server的版本
#rpm -qi mysql-server
2.2 离线安装mysql
2.2.1 检查是否安装mysql
方法同2.1.1
2.2.2 通过rpm安装mysql
1. 需要准备离线安装包
MySQL-server-5.5.30-1.el6.x86_64.rpm
MySQL-client-5.5.30-1.el6.x86_64.rpm
MySQL-devel-5.5.30-1.el6.x86_64.rpm
2.安装新的MySQL
#rpm -ivh MySQL-server-5.5.30-1.el6.x86_64.rpm
#rpm -ivh MySQL-client-5.5.30-1.el6.x86_64.rpm
#rpm -ivh MySQL-devel-5.5.30-1.el6.x86_64.rpm
3.启动MySQL服务
#service mysql start
4.查看mysql运行状态
#/etc/rc.d/init.d/mysqld status
5.MySQL服务一些其他命令
a、察看mysql是否在自动启动列表: #/sbin/chkconfig –list
b、添加mysql到系统自启动服务组: #/sbin/chkconfig – addmysql
c、把mysql从启动服务组中删除: #/sbin/chkconfig – delmysql
d、停止mysql服务: # service mysqld stop
e、脚本启动mysql服务: # /etc/rc.d/init.d/mysqld start
f、脚本停止mysql服务: # /etc/rc.d/init.d/mysqld stop
2.3 mysql设置密码
命令如下:
# /usr/bin/mysqladmin -u root password '123456'
2.4 mysql设置开机启动
2.4.0.1 查看Mysql服务是否是开机启动
命令如下:
#chkconfig --list | grep mysqld
2.4.0.2 设置开机启动
命令如下:
# chkconfig mysqld on
2.5 Mysql数据库的主要配置
/etc/my.cnf 这是mysql的主配置文件
我们可以查看一下这个文件的一些信息
# cat my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
简要介绍
./var/lib/mysql mysql数据库的数据库文件存放位置
./var/log mysql数据库的日志输出存放位置
3 C与Mysql
3.1 Mysql C API 函数概述
这里归纳了C API可使用的函数
函数 | 描述 |
mysql_affected_rows() | 返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。 |
mysql_autocommit() | 切换 autocommit模式,ON/OFF |
mysql_change_user() | 更改打开连接上的用户和数据库。 |
mysql_charset_name() | 返回用于连接的默认字符集的名称。 |
mysql_close() | 关闭服务器连接。 |
mysql_commit() | 提交事务。 |
mysql_connect() | 连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。 |
mysql_create_db() | 创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。 |
mysql_data_seek() | 在查询结果集中查找属性行编号。 |
mysql_debug() | 用给定的字符串执行DBUG_PUSH。 |
mysql_drop_db() | 撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。 |
mysql_dump_debug_info() | 让服务器将调试信息写入日志。 |
mysql_eof() | 确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。 |
mysql_errno() | 返回上次调用的MySQL函数的错误编号。 |
mysql_error() | 返回上次调用的MySQL函数的错误消息。 |
mysql_escape_string() | 为了用在SQL语句中,对特殊字符进行转义处理。 |
mysql_fetch_field() | 返回下一个表字段的类型。 |
mysql_fetch_field_direct() | 给定字段编号,返回表字段的类型。 |
mysql_fetch_fields() | 返回所有字段结构的数组。 |
mysql_fetch_lengths() | 返回当前行中所有列的长度。 |
mysql_fetch_row() | 从结果集中获取下一行 |
mysql_field_seek() | 将列光标置于指定的列。 |
mysql_field_count() | 返回上次执行语句的结果列的数目。 |
mysql_field_tell() | 返回上次mysql_fetch_field()所使用字段光标的位置。 |
mysql_free_result() | 释放结果集使用的内存。 |
mysql_get_client_info() | 以字符串形式返回客户端版本信息。 |
mysql_get_client_version() | 以整数形式返回客户端版本信息。 |
mysql_get_host_info() | 返回描述连接的字符串。 |
mysql_get_server_version() | 以整数形式返回服务器的版本号。 |
mysql_get_proto_info() | 返回连接所使用的协议版本。 |
mysql_get_server_info() | 返回服务器的版本号。 |
mysql_info() | 返回关于最近所执行查询的信息。 |
mysql_init() | 获取或初始化MYSQL结构。 |
mysql_insert_id() | 返回上一个查询为AUTO_INCREMENT列生成的ID。 |
mysql_kill() | 杀死给定的线程。 |
mysql_library_end() | 最终确定MySQL C API库。 |
mysql_library_init() | 初始化MySQL C API库。 |
mysql_list_dbs() | 返回与简单正则表达式匹配的数据库名称。 |
mysql_list_fields() | 返回与简单正则表达式匹配的字段名称。 |
mysql_list_processes() | 返回当前服务器线程的列表。 |
mysql_list_tables() | 返回与简单正则表达式匹配的表名。 |
mysql_more_results() | 检查是否还存在其他结果。 |
mysql_next_result() | 在多语句执行过程中返回/初始化下一个结果。 |
mysql_num_fields() | 返回结果集中的列数。 |
mysql_num_rows() | 返回结果集中的行数。 |
mysql_options() | 为mysql_connect()设置连接选项。 |
mysql_ping() | 检查与服务器的连接是否工作,如有必要重新连接。 |
mysql_query() | 执行指定为“以Null终结的字符串”的SQL查询。 |
mysql_real_connect() | 连接到MySQL服务器。 |
mysql_real_escape_string() | 考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。 |
mysql_real_query() | 执行指定为计数字符串的SQL查询。 |
mysql_refresh() | 刷新或复位表和高速缓冲。 |
mysql_reload() | 通知服务器再次加载授权表。 |
mysql_rollback() | 回滚事务。 |
mysql_row_seek() | 使用从mysql_row_tell()返回的值,查找结果集中的行偏移。 |
mysql_row_tell() | 返回行光标位置。 |
mysql_select_db() | 选择数据库。 |
mysql_server_end() | 最终确定嵌入式服务器库。 |
mysql_server_init() | 初始化嵌入式服务器库。 |
mysql_set_server_option() | 为连接设置选项(如多语句)。 |
mysql_sqlstate() | 返回关于上一个错误的SQLSTATE错误代码。 |
mysql_shutdown() | 关闭数据库服务器。 |
mysql_stat() | 以字符串形式返回服务器状态。 |
mysql_store_result() | 检索完整的结果集至客户端。 |
mysql_thread_id() | 返回当前线程ID。 |
mysql_thread_safe() | 如果客户端已编译为线程安全的,返回1。 |
mysql_use_result() | 初始化逐行的结果集检索。 |
mysql_warning_count() | 返回上一个SQL语句的告警数。 |
3.2 API使用的一般原则
与MySQL交互时,应用程序应使用该一般性原则:
1. 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。
2. 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。
3. 发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。
4. 通过调用mysql_close(),关闭与MySQL服务器的连接。
5. 通过调用mysql_library_end(),结束MySQL库的使用。
调用mysql_library_init()和mysql_library_end()的目的在于,为MySQL库提供恰当的初始化和结束处理。对于与客户端库链接的应用程序,它们提供了改进的内存管理功能。如果不调用mysql_library_end(),内存块仍将保持分配状态(这不会增加应用程序使用的内存量,但某些内存泄漏检测器将抗议它)。对于与嵌入式服务器链接的应用程序,这些调用会启动并停止服务器。
mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名称更清楚地指明,无论应用程序使用的是mysqlclient或mysqld库,启动或结束MySQL库时,应调用它们。对于早期的MySQL版本,可调用mysql_server_init()和mysql_server_end()取而代之。
如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。
要想连接到服务器,可调用mysql_init()来初始化连接处理程序,然后用该处理程序(以及其他信息,如主机名、用户名和密码)调用mysql_real_connect()。建立连接后,在低于5.0.3版的API中,mysql_real_connect()会将再连接标志(MYSQL结构的一部分)设置为1,或在较新的版本中,将其设置为0。对于该标志,值“1”指明,如果因连接丢失而无法执行语句,放弃之前,会尝试再次连接到服务器。从MySQL 5.0.13开始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以控制再连接行为。完成连接后,调用mysql_close()中止它。
当连接处于活动状态时,客户端或许会使用mysql_query()或mysql_real_query()向服务器发出SQL查询。两者的差别在于,mysql_query()预期的查询为指定的、由Null终结的字符串,而mysql_real_query()预期的是计数字符串。如果字符串包含二进制数据(其中可能包含Null字节),就必须使用mysql_real_query()。
对于每个非SELECT查询(例如INSERT、UPDATE、DELETE),通过调用mysql_affected_rows(),可发现有多少行已被改变(影响)。
对于SELECT查询,能够检索作为结果集的行。注意,某些语句因其返回行,类似与SELECT。包括SHOW、DESCRIBE和EXPLAIN。应按照对待SELECT语句的方式处理它们。
客户端处理结果集的方式有两种。一种方式是,通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。第二种方式是针对客户端的,通过调用mysql_use_result(),对“按行”结果集检索进行初始化处理。该函数能初始化检索结果,但不能从服务器获得任何实际行。
在这两种情况下,均能通过调用mysql_fetch_row()访问行。通过mysql_store_result(),mysql_fetch_row()能够访问以前从服务器获得的行。通过mysql_use_result(),mysql_fetch_row()能够实际地检索来自服务器的行。通过调用mysql_fetch_lengths(),能获得关于各行中数据大小的信息。
完成结果集操作后,请调用mysql_free_result()释放结果集使用的内存。
这两种检索机制是互补的。客户端程序应选择最能满足其要求的方法。实际上,客户端最常使用的是mysql_store_result()。
mysql_store_result()的1个优点在于,由于将行全部提取到了客户端上,你不仅能连续访问行,还能使用mysql_data_seek()或mysql_row_seek()在结果集中向前或向后移动,以更改结果集内当前行的位置。通过调用mysql_num_rows(),还能发现有多少行。另一方面,对于大的结果集,mysql_store_result()所需的内存可能会很大,你很可能遇到内存溢出状况。
mysql_use_result()的1个优点在于,客户端所需的用于结果集的内存较少,原因在于,一次它仅维护一行(由于分配开销较低,mysql_use_result()能更快)。它的缺点在于,你必须快速处理每一行以避免妨碍服务器,你不能随机访问结果集中的行(只能连续访问行),你不知道结果集中有多少行,直至全部检索了它们为止。不仅如此,即使在检索过程中你判定已找到所寻找的信息,也必须检索所有的行。
通过API,客户端能够恰当地对查询作出响应(仅在必要时检索行),而无需知道查询是否是SELECT查询。可以在每次mysql_query()或mysql_real_query()后,通过调用mysql_store_result()完成该操作。如果结果集调用成功,查询为SELECT,而且能够读取行。如果结果集调用失败,可调用mysql_field_count()来判断结果是否的确是所预期的。如果mysql_field_count()返回0,查询不返回数据(表明它是INSERT、UPDATE、DELETE等),而且不返回行。如果mysql_field_count()是非0值,查询应返回行,但没有返回行。这表明查询是失败了的SELECT。关于如何实现该操作的示例,请参见关于mysql_field_count()的介绍。
无论是mysql_store_result()还是mysql_use_result(),均允许你获取关于构成结果集的字段的信息(字段数目,它们的名称和类型等)。通过重复调用mysql_fetch_field(),可以按顺序访问行内的字段信息,或者,通过调用mysql_fetch_field_direct(),能够在行内按字段编号访问字段信息。通过调用mysql_field_seek(),可以改变当前字段的光标位置。对字段光标的设置将影响后续的mysql_fetch_field()调用。此外,你也能通过调用mysql_fetch_fields(),一次性地获得关于字段的所有信息。
为了检测和通报错误,MySQL提供了使用mysql_errno()和mysql_error()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错误消息,最近调用的函数可能成功也可能失败,这样,你就能判断错误是在何时出现的,以及错误是什么。
4 C API使用示例
4.1 连接数据库
- /*练习mysql数据库的连接*/
- #include <stdio.h>
- #include <mysql.h>
- int main()
- {
- MYSQL mysql;
- int t, r;
- /*连接之前,先用mysql_init初始化MYSQL连接句柄*/
- mysql_init(&mysql);
- /*使用mysql_real_connect连接服务器,其参数依次为MYSQL句柄,服务器IP地址,
- 登录mysql的用户名,密码,要连接的数据库等*/
- if(!mysql_real_connect(&mysql, "localhost", "root", "6748355", "spytest", 0, NULL, 0))
- printf("Error connecting to Mysql!\n");
- else
- printf("Connected Mysql successful!\n");
- /*关闭连接*/
- mysql_close(&mysql);
- return 0;
- }
4.2 数据库查询
|
4.3 数据库插入数据
- /*练习mysql数据库的数据添加*/
- #include <stdio.h>
- #include <string.h>
- #include "mysql.h"
- int main()
- {
- MYSQL mysql;
- MYSQL_RES *res;
- MYSQL_ROW row;
- char *query;
- int flag, t;
- mysql_init(&mysql);
- if(!mysql_real_connect(&mysql, "localhost", "root", "6748355", "spytest", 0, NULL, 0)) {
- printf("Failed to connect to Mysql!\n");
- return 0;
- }else {
- printf("Connected to Mysql successfully!\n");
- }
- query = "insert into log(title, keyword, content) values('sleep', 'rest', 'I have a dream')";
- /*插入,成功则返回0*/
- flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query));
- if(flag) {
- printf("Insert data failure!\n");
- return 0;
- }else {
- printf("Insert data success!\n");
- }
- mysql_close(&mysql);
- return 0;
- }
4.4 数据库删除
|