中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

廣告?zhèn)髅焦揪W(wǎng)站網(wǎng)站推廣策劃報告

廣告?zhèn)髅焦揪W(wǎng)站,網(wǎng)站推廣策劃報告,如何自己申請商標(biāo)注冊,wordpress更新php版本Linux下MySQL的簡單使用 導(dǎo)語MySQL安裝與配置 MySQL安裝密碼設(shè)置 MySQL管理 命令 myisamchkmysql其他 常見操作 C語言訪問MYSQL 連接例程錯誤處理使用SQL 總結(jié)參考文獻 導(dǎo)語 這一章是MySQL的使用,一些常用的MySQL語句屬于本科階段內(nèi)容,然后是C語言和M…
Linux下MySQL的簡單使用
  • 導(dǎo)語
  • MySQL安裝與配置
    • MySQL安裝
    • 密碼設(shè)置
  • MySQL管理
    • 命令
      • myisamchk
      • mysql
      • 其他
    • 常見操作
  • C語言訪問MYSQL
    • 連接例程
    • 錯誤處理
    • 使用SQL
  • 總結(jié)
  • 參考文獻

導(dǎo)語

這一章是MySQL的使用,一些常用的MySQL語句屬于本科階段內(nèi)容,然后是C語言和MySQl之間的交互,可以看到C語言已經(jīng)有成熟的和MySQL的接口

MySQL安裝與配置

MySQL安裝

MySQL的安裝很簡單,只需要執(zhí)行幾個shell命令就行,需要注意的是,對于Ubuntu新機器來說最好不要一開始就執(zhí)行sudo apt update,因為很多包之間的依賴是復(fù)雜且未知的,如果直接全部更新可能會導(dǎo)致在跟書上同步實驗時出問題(命令參考了ubuntu 23.10.1 mysql 安裝)

sudo apt install mysql-server -y#這里就安裝好了服務(wù)器
systemctl start mysql#開啟mysql服務(wù)
systemctl status mysql#檢查狀態(tài),如果出現(xiàn)mysql>就沒問題sudo mysul -u root mysql#進入mysql
ps -el | grep mysqld#可以看mysql是否啟動

下面這個是備選方案,是在新機器上裝的

sudo apt-get update
sudo apt-get install libmysqlclient-dev
mysql_config --cflags
mysql_config --libs

后兩條命令是檢測MySQL Connector/C是否安裝完成,由于新版本的MySQL已經(jīng)不支持書上的寫法,所以需要安裝這個包,正常應(yīng)該顯示如下圖

在這里插入圖片描述

之后直接安裝服務(wù)器即可

sudo apt-get update
sudo apt-get install mysql-server

通過下面的程序驗證安裝是否成功

#include <stdio.h>
#include <mysql/mysql.h>int main() {MYSQL *conn;conn = mysql_init(NULL);if (conn == NULL) {fprintf(stderr, "mysql_init() failed
");return EXIT_FAILURE;}if (mysql_real_connect(conn, "localhost", "user", "password", "database", 0, NULL, 0) == NULL) {fprintf(stderr, "mysql_real_connect() failed: %s
", mysql_error(conn));mysql_close(conn);return EXIT_FAILURE;}printf("Connected to the database successfully!
");mysql_close(conn);return EXIT_SUCCESS;
}

執(zhí)行的命令和結(jié)果如下

gcc -o test_program test_program.c $(mysql_config --cflags) $(mysql_config --libs)

在這里插入圖片描述

密碼設(shè)置

一開始的root是沒有密碼的,可以通過命令查看各用戶的密碼如下,可以看到root密碼為空

在這里插入圖片描述

這里需要注意的是新版的MySQL和老版的不一樣,新版本的password列改成了authentication_string

可以執(zhí)行命令來設(shè)置密碼,修改后查看,可以看到root有密碼,但是被MySQL加密過了,再次登錄時直接回車發(fā)現(xiàn)無法識別,只有輸入密碼才能識別用戶

在這里插入圖片描述

這里我們刪除除去root之外的默認用戶,并且刪除從localhost以外任何主機的登錄

在這里插入圖片描述

到此為止,我們有了一個運行的MySQL,該MySQL只有設(shè)定密碼的root通過本地才能連接,為了方便后續(xù)的操作,這里創(chuàng)建一個普通用戶rick,它將能用三種方法來連接MySQL(本地連接,從IP連接,從wiley.com域中任何機器連接)

首先為rick創(chuàng)建一個本地登錄,這里書上給的代碼太老了,已經(jīng)不適配現(xiàn)在的MySQL,更改成了現(xiàn)在版本的,最新的 MySQL 版本中,GRANT 語句不再用于設(shè)置用戶密碼。密碼應(yīng)該通過單獨的 CREATE USER 或 SET PASSWORD 語句來設(shè)置。

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

通過三種不同的方式設(shè)置了三個用戶,可以通過select命令展示,可以看到三種方式都成功了,并且rick的權(quán)利很大

在這里插入圖片描述

MySQL管理

命令

所有命令都接受三個標(biāo)準(zhǔn)參數(shù)

-u 用于指定用戶(用戶名)
-p 用于提示密碼(如果在命令行中未直接提供)
-h 用于指定主機(MySQL 服務(wù)器地址)

除了標(biāo)準(zhǔn)參數(shù)之外,每個命令還有自己的命令選項

myisamchk

通常情況下,myisamchk以創(chuàng)建的mysql用戶運行并且工作目錄為數(shù)據(jù)表在的目錄中,常見的命令選項有

-c 檢查表以發(fā)現(xiàn)錯誤
-e 執(zhí)行擴展檢查
-r 修復(fù)發(fā)現(xiàn)的錯誤

mysql

使用mysql可以不經(jīng)過MySQL的控制臺完成很多功能,通過在命令行最后添加數(shù)據(jù)庫名稱作為參數(shù)即可,可以通過 mysql --help | less來查看所有的命令行選項列表

其他

還有一些其他的命令,如mysqladmin、mysqlbug等,由于MySQL已經(jīng)相對于書上更新很多了,所以很多命令已經(jīng)過時,在此不多贅述

常見操作

書上提供的常見操作包括grant、revoke以及數(shù)據(jù)類型等,這些屬于本科階段SQL的基本內(nèi)容,在此不再贅述,跳過

C語言訪問MYSQL

連接例程

C語言連接MySQL需要先初始化一個連接句柄結(jié)構(gòu),然后再進行實際的連接,句柄通過mysql_init函數(shù)初始化,函數(shù)原型具體如下,mysql_init() 函數(shù)通常是在使用 MySQL 客戶端 API 進行數(shù)據(jù)庫編程時的第一個步驟。它為連接操作做了準(zhǔn)備,確保在進行連接操作之前,連接對象處于一個已初始化的狀態(tài)

MYSQL *mysql_init(MYSQL *);
//mysql:一個指向 MYSQL 結(jié)構(gòu)體的指針。如果該指針為空,
//mysql_init() 將分配一個新的 MYSQL 結(jié)構(gòu)體并返回它。如果提供了一個非空指針,它會用新的數(shù)據(jù)初始化該對象

真正與數(shù)據(jù)庫進行連接的是mysql_real_connect函數(shù),函數(shù)原型如下

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *dbname, unsigned int port, const char *unix_socket, unsigned long client_flag);
//mysql是初始化之后的句柄

還有例程函數(shù)和關(guān)閉函數(shù),在此不贅述

現(xiàn)在嘗試創(chuàng)立一個數(shù)據(jù)庫,向其中填入數(shù)據(jù)并通過C語言訪問它

在這里插入圖片描述

逐行輸入對數(shù)據(jù)庫的操作比較麻煩,并且容易出錯,可以把要執(zhí)行的命令單獨做成文件,然后直接導(dǎo)入執(zhí)行

-- Create the table childrenCREATE 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);

在這里插入圖片描述
在這里插入圖片描述

可以看到數(shù)據(jù)都被成功插入了

之后可以通過上述函數(shù)來連接數(shù)據(jù)庫,由于系統(tǒng)和包之間的依賴問題以及mysql的版本問題,導(dǎo)致這個程序無法在舊機上運行,暫時沒有找到解決方案,在新機上可以運行,運行結(jié)果和程序如下

#include <stdlib.h>
#include <stdio.h>
#include <mysql/mysql.h>  // 包含新版 MySQL Connector/C 的頭文件int main(int argc, char *argv[])
{MYSQL *con;// 初始化 MySQL 連接句柄con = mysql_init(NULL);if (con == NULL) {fprintf(stderr, "mysql_init() failed
");return EXIT_FAILURE;}// 連接數(shù)據(jù)庫if (mysql_real_connect(con, "localhost", "rick", "111111", "foo", 0, NULL, 0) == NULL) {fprintf(stderr, "mysql_real_connect() failed
");fprintf(stderr, "Error: %s
", mysql_error(con));mysql_close(con);return EXIT_FAILURE;}// 輸出連接成功狀態(tài)printf("Connected successfully!
");// 關(guān)閉連接mysql_close(con);return EXIT_SUCCESS;
}

在這里插入圖片描述

執(zhí)行的時候需要添加對應(yīng)的inlcude路徑和庫文件路徑

錯誤處理

MySQL使用一系列由連接句柄結(jié)構(gòu)報告的返回碼來獲取錯誤信息,具體的函數(shù)原型如下

unsigned int mysql_errno(MYSQL *connection);
//返回錯誤碼
char *mysql_error(MYSQL *connection);
//返回有意義的文本信息

這里是書上給出的一個例子以及運行結(jié)果,可以看到屏幕上輸出了錯誤信息

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>int main(int argc, char *argv[]) {MYSQL my_connection;mysql_init(&my_connection);if (mysql_real_connect(&my_connection, "localhost", "rick", "I do not know", "foo", 0, NULL, 0)) {printf("Connection success
");mysql_close(&my_connection);} else {fprintf(stderr, "Connection failed
");if (mysql_errno(&my_connection)) {fprintf(stderr, "Connection error %d: %s
",mysql_errno(&my_connection), mysql_error(&my_connection));}}return EXIT_SUCCESS;
}

在這里插入圖片描述

使用SQL

這里直接給出一些C語言執(zhí)行SQL語句的函數(shù)原型和簡單解釋

int mysql_query(MYSQL *connection, const char *query);
//第一個是初始化后的句柄,第二個是sql語句,返回錯誤碼
my_ulonglong mysql_affected_rows(MYSQL *connection);
//查詢上一條指令運行后影響了多少行

書上給出了一個使用AUTO_INCREMENT的代碼實例,下面是修改后的程序和運行結(jié)果,AUTO_INCREMENT對每次插入的數(shù)據(jù)分配一個新的id值并進行追蹤

#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>#define DB_HOST "localhost"
#define DB_USER "rick"  // 用戶名 'rick'
#define DB_PASS "111111" // 數(shù)據(jù)庫密碼
#define DB_NAME "foo" // 數(shù)據(jù)庫名稱 'foo'// 錯誤處理函數(shù),減少冗余代碼
void handle_error(MYSQL *connection, const char *message) {fprintf(stderr, "%s
Error %d: %s
", message, mysql_errno(connection), mysql_error(connection));mysql_close(connection);exit(EXIT_FAILURE);
}int main(int argc, char *argv[]) {MYSQL my_connection;MYSQL_RES *res_ptr;MYSQL_ROW sqlrow;int res;// 初始化 MySQL 連接對象mysql_init(&my_connection);// 連接數(shù)據(jù)庫if (!mysql_real_connect(&my_connection, DB_HOST, DB_USER, DB_PASS, DB_NAME, 0, NULL, 0)) {handle_error(&my_connection, "Connection failed");}printf("Connection success
");// 插入數(shù)據(jù)到表中res = mysql_query(&my_connection, "INSERT INTO children(fname, age) VALUES('Robert', 7)");if (res) {handle_error(&my_connection, "Insert error");} else {printf("Inserted %lu rows
", (unsigned long)mysql_affected_rows(&my_connection));}// 查詢最后插入的數(shù)據(jù)res = mysql_query(&my_connection, "SELECT LAST_INSERT_ID()");if (res) {handle_error(&my_connection, "SELECT error");}// 獲取查詢結(jié)果res_ptr = mysql_use_result(&my_connection);if (res_ptr) {// 迭代結(jié)果集并輸出while ((sqlrow = mysql_fetch_row(res_ptr))) {printf("We inserted childno %s
", sqlrow[0]);}// 釋放結(jié)果集mysql_free_result(res_ptr);} else {fprintf(stderr, "Failed to retrieve result set.
");}// 關(guān)閉連接mysql_close(&my_connection);return EXIT_SUCCESS;
}

可以看到成功插入了一行,并且通過LAST_INSERT_ID拿到了ID

在這里插入圖片描述

這里附上書上數(shù)據(jù)對應(yīng)的插入代碼

-- Create the table childrenCREATE TABLE children (childno INT(11) AUTO_INCREMENT NOT NULL PRIMARY KEY,fname VARCHAR(30),age INT
);-- Populate the table 'children'INSERT INTO children (fname, age) VALUES ('Jenny', 21);
INSERT INTO children (fname, age) VALUES ('Andrew', 17);
INSERT INTO children (fname, age) VALUES ('Gavin', 8);
INSERT INTO children (fname, age) VALUES ('Duncan', 6);
INSERT INTO children (fname, age) VALUES ('Emma', 4);
INSERT INTO children (fname, age) VALUES ('Alex', 15);
INSERT INTO children (fname, age) VALUES ('Adrian', 9);
INSERT INTO children (fname, age) VALUES ('Ann', 3);
INSERT INTO children (fname, age) VALUES ('Ann', 4);
INSERT INTO children (fname, age) VALUES ('Ann', 3);
INSERT INTO children (fname, age) VALUES ('Ann', 4);

除了上述兩個基本的函數(shù)之外還有一些其他的函數(shù),函數(shù)原型如下

MYSQL_RES *mysql_store_result(MYSQL *connection);
//從返回數(shù)據(jù)的語句中提取所有的數(shù)據(jù),返回一個指向結(jié)果集的指針
my_ulonglong mysql_num_rows(MYSQL_RES *result);
//統(tǒng)計返回結(jié)果中的行數(shù)
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
//從結(jié)果集中提取一行,把這一行放在行機構(gòu)里,每次使用一個
void mysql_data_seek(MYSQL_RES *result, my_ulonglong offset);
//在結(jié)果集中跳轉(zhuǎn),第二個參數(shù)是行號,設(shè)置下一個被fetch操作返回的行
MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result);
//返回一個偏移值,表示結(jié)果集中的當(dāng)前位置(不是行號)
void mysql_free_result(MYSQL_RES *result);
//對結(jié)果集的操作完成后,需要調(diào)用這個函數(shù)清理已經(jīng)分配的對象
MYSQL_RES *mysql_use_result(MYSQL *connection);
//提取一行數(shù)據(jù),返回指向?qū)ο蟮闹羔?#xff0c;不會緩存
//適合處理大數(shù)據(jù)量的查詢結(jié)果,因為它允許逐行讀取而不會將所有行一次性加載到內(nèi)存中,這樣可以有效減少內(nèi)存的使用
unsigned int mysql_field_count(MYSQL *connection);
//獲取最近一次查詢的結(jié)果集中字段(列)的數(shù)量
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
//用于從查詢結(jié)果的字段列表中獲取每個字段的描述信息,類似于字段的元數(shù)據(jù)。
//返回一個指向 MYSQL_FIELD 結(jié)構(gòu)體的指針,這個結(jié)構(gòu)體包含了字段的詳細信息(例如字段名、類型等)。

下面是書上給出的一個綜合程序(用chatgpt優(yōu)化了),基本上用到了上面的所有函數(shù),還有運行結(jié)果和具體的程序解釋

#include <stdlib.h>
#include <stdio.h>
#include <mysql.h>// MySQL 連接對象和結(jié)果集
MYSQL my_connection;
MYSQL_RES *res_ptr;
MYSQL_ROW sqlrow;// 函數(shù)聲明
void display_header();
void display_row();int main(int argc, char *argv[]) {int res;int first_row = 1;  // 用于確保我們只顯示一次表頭// 初始化 MySQL 連接對象mysql_init(&my_connection);// 嘗試連接到數(shù)據(jù)庫if (mysql_real_connect(&my_connection, "localhost", "rick", "111111", "foo", 0, NULL, 0)) {printf("Connection success
");// 執(zhí)行 SQL 查詢,選擇年齡大于 5 的記錄res = mysql_query(&my_connection, "SELECT childno, fname, age FROM children WHERE age > 5");if (res) {// 查詢執(zhí)行失敗,打印錯誤信息fprintf(stderr, "SELECT error: %s
", mysql_error(&my_connection));} else {// 使用 mysql_store_result() 獲取結(jié)果集到內(nèi)存res_ptr = mysql_store_result(&my_connection);if (res_ptr) {// 獲取每行的數(shù)據(jù)并顯示while ((sqlrow = mysql_fetch_row(res_ptr))) {if (first_row) {// 首次顯示表頭display_header();first_row = 0;}// 顯示每行數(shù)據(jù)display_row();}// 釋放結(jié)果集資源mysql_free_result(res_ptr);} else {// 獲取結(jié)果集失敗,打印錯誤信息fprintf(stderr, "Failed to retrieve result set: %s
", mysql_error(&my_connection));}}// 關(guān)閉數(shù)據(jù)庫連接mysql_close(&my_connection);} else {// 連接失敗,打印錯誤信息fprintf(stderr, "Connection failed
");if (mysql_errno(&my_connection)) {fprintf(stderr, "Connection error %d: %s
",mysql_errno(&my_connection), mysql_error(&my_connection));}}return EXIT_SUCCESS;
}// 顯示表頭,列出字段名稱及其相關(guān)屬性
void display_header() {MYSQL_FIELD *field_ptr;//獲得列名printf("Column details:
");while ((field_ptr = mysql_fetch_field(res_ptr)) != NULL) {// 顯示字段的名稱printf("	 Name: %s
", field_ptr->name);printf("	 Type: ");// 判斷字段類型并顯示if (IS_NUM(field_ptr->type)) {//數(shù)字printf("Numeric field
");} else {switch (field_ptr->type) {//字符串case FIELD_TYPE_VAR_STRING:printf("VARCHAR
");break;case FIELD_TYPE_LONG:printf("LONG
");break;default:printf("Type is %d, check in mysql_com.h
", field_ptr->type);}}// 顯示字段的最大長度printf("	 Max width %ld
", field_ptr->length);// 檢查字段是否具有 AUTO_INCREMENT 屬性if (field_ptr->flags & AUTO_INCREMENT_FLAG) {printf("	 Auto increments
");}printf("
");}
}// 顯示查詢結(jié)果的每一行
void display_row() {unsigned int field_count;// 遍歷每一列,打印其值field_count = 0;while (field_count < mysql_num_fields(res_ptr)) {//如果域名數(shù)量比當(dāng)前索引大if (sqlrow[field_count]) {//sqlrow存了這一行的數(shù)據(jù)printf("%s ", sqlrow[field_count]);} else {printf("NULL ");}field_count++;}printf("
");
}

在這里插入圖片描述

還有更多的函數(shù),在此不再贅述,可以查看MYSQL手冊相關(guān)

總結(jié)

可以看到C語言已經(jīng)有了很成熟的與MySQL交互的接口,并且大部分函數(shù)的使用是和MySQL版本不相關(guān)的,但實際在Ubuntu運行的時候還是需要注意MySQL的版本和包的問題,因為新版本的MySQL庫修改了一些配置文件的位置和相關(guān)的依賴包

參考文獻

  1. ubuntu 23.10.1 mysql 安裝
  2. ChatGPT
http://www.risenshineclean.com/news/36985.html

相關(guān)文章:

  • html5網(wǎng)站開發(fā)的源碼網(wǎng)絡(luò)顧問
  • 西藏建設(shè)廳網(wǎng)站首頁seo科技網(wǎng)
  • 做視頻網(wǎng)站虛擬主機怎么選廣告聯(lián)盟接廣告
  • wordpress 采集圖片seo排名點擊首頁
  • 怎么用服務(wù)器搭建網(wǎng)站推廣之家app下載
  • 公司名稱注冊查詢系統(tǒng)seo營銷工具
  • wordpress漂亮的主題網(wǎng)站seo優(yōu)化有哪些方面
  • 商丘做網(wǎng)站sqlongliqi市場營銷四大基本策略
  • linux如何架設(shè)網(wǎng)站貴陽網(wǎng)絡(luò)推廣排名
  • 微信小程序視頻網(wǎng)站開發(fā)教程靜態(tài)網(wǎng)頁制作
  • 網(wǎng)站建設(shè)圖片怎么做免費b站網(wǎng)頁推廣
  • 網(wǎng)站做數(shù)據(jù)分析的意義北京百度推廣投訴電話
  • 做網(wǎng)站營業(yè)執(zhí)照經(jīng)營范圍怎么填寫免費seo排名軟件
  • 做公司網(wǎng)站用什么系統(tǒng)上海疫情最新數(shù)據(jù)
  • 淮安市哪里可以做網(wǎng)站開魯視頻
  • wordpress頁面教程視頻小紅書搜索優(yōu)化
  • 商標(biāo) 做網(wǎng)站 是幾類站長工具天美傳媒
  • 雅安交通建設(shè)集團網(wǎng)站太原網(wǎng)絡(luò)推廣公司哪家好
  • 鄭州網(wǎng)站建設(shè)網(wǎng)站制作百度官網(wǎng)推廣平臺電話
  • 輕云服務(wù)器 多個網(wǎng)站今日頭條鄭州頭條新聞
  • 泉州網(wǎng)站制作專業(yè)產(chǎn)品怎么做市場推廣
  • 網(wǎng)站建設(shè)的常用詞搜收錄網(wǎng)
  • 動態(tài)購物網(wǎng)站開發(fā)源代碼西地那非能提高硬度嗎
  • 做網(wǎng)站能拿多少錢淘寶指數(shù)查詢工具
  • 電信服務(wù)器做網(wǎng)站網(wǎng)絡(luò)整合營銷理論案例
  • 織夢響應(yīng)式茶葉網(wǎng)站流感用什么藥最好
  • 網(wǎng)站access數(shù)據(jù)怎么做朝陽seo推廣
  • 專業(yè)鄭州做網(wǎng)站的公司百度關(guān)鍵詞seo優(yōu)化
  • 網(wǎng)站域名授權(quán)怎么做什么叫seo
  • 佛山網(wǎng)站建設(shè)收費標(biāo)準(zhǔn)seo索引擎優(yōu)化