Đây là bài hướng dẫn lập trình C cho cơ sở dữ liệu MySQL. Nó bao gồm những điều cơ bản về lập trình MySQL với API C. Bạn cũng có thể cân nhắc xem hướng dẫn về MySQL trên ZetCode
Về cơ sở dữ liệu MySQL
MySQL là hệ quản trị cơ sở dữ liệu mã nguồn mở hàng đầu. Nó là một hệ thống quản lý cơ sở dữ liệu đa người dùng, đa luồng. MySQL đặc biệt phổ biến trên web. MySQL hiện thuộc sở hữu của Oracle. Cơ sở dữ liệu MySQL có sẵn trên hầu hết các nền tảng hệ điều hành quan trọng. Nó chạy trên BSD Unix, Linux, Windows hoặc Mac OS
MariaDB là một ngã ba được cộng đồng phát triển, hỗ trợ thương mại của hệ thống quản lý cơ sở dữ liệu quan hệ MySQL
$ sudo apt install default-libmysqlclient-dev
Để có thể biên dịch các ví dụ C, chúng ta cần cài đặt các thư viện phát triển MySQL C. Dòng trên cho thấy cách chúng ta có thể làm điều đó trên Linux dựa trên Debian
C99
Hướng dẫn này sử dụng C99. Đối với trình biên dịch GNU C, chúng ta cần thêm tùy chọn -std=c99. Đối với người dùng Windows, Pelles C IDE rất được khuyến khích. [MSVC không hỗ trợ C99. ]
MYSQL *con = mysql_init[NULL];
Trong C99, chúng ta có thể kết hợp khai báo với mã. Trong các chương trình C cũ hơn, chúng ta cần tách dòng này thành hai dòng
MySQL C ví dụ đầu tiên
Trong ví dụ đầu tiên, chúng tôi kiểm tra một lệnh gọi hàm MySQL
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }
$ c99 version.c -o version `mysql_config --cflags --libs`6 hiển thị phiên bản máy khách MySQL
#include #include #include
Chúng tôi bao gồm các tệp tiêu đề cần thiết
printf["MySQL client version: %s\n", mysql_get_client_info[]];
Dòng mã này xuất phiên bản của máy khách MySQL. Đối với điều này, chúng tôi sử dụng lệnh gọi hàm
$ c99 version.c -o version `mysql_config --cflags --libs`6
exit[0];
Chúng tôi thoát khỏi kịch bản
$ c99 version.c -o version `mysql_config --cflags --libs`
Đây là cách chúng tôi biên dịch ví dụ mã
$ ./version MySQL client version: 10.3.24
Đây là đầu ra
MySQL C tạo cơ sở dữ liệu
Ví dụ mã tiếp theo sẽ tạo cơ sở dữ liệu. Ví dụ mã có thể được chia thành các phần này
- Bắt đầu cấu trúc xử lý kết nối
- Tạo kết nối
- Thực hiện một truy vấn
- Đóng kết nối
MYSQL *con = mysql_init[NULL];0
Ví dụ code kết nối với hệ cơ sở dữ liệu MySQL và tạo cơ sở dữ liệu mới có tên là
$ c99 version.c -o version `mysql_config --cflags --libs`8
MYSQL *con = mysql_init[NULL];
Hàm
$ c99 version.c -o version `mysql_config --cflags --libs`9 phân bổ hoặc khởi tạo một đối tượng MYSQL phù hợp với hàm
$ ./version MySQL client version: 10.3.240. Hãy nhớ rằng đây là C99
MYSQL *con = mysql_init[NULL];0
Chúng tôi kiểm tra giá trị trả về. Nếu chức năng
$ c99 version.c -o version `mysql_config --cflags --libs`9 không thành công, chúng tôi sẽ in thông báo lỗi và chấm dứt ứng dụng
MYSQL *con = mysql_init[NULL];1
Hàm
$ ./version MySQL client version: 10.3.240 thiết lập kết nối tới cơ sở dữ liệu. Chúng tôi cung cấp các tham số xử lý kết nối, tên máy chủ, tên người dùng và mật khẩu cho chức năng. Bốn tham số khác là tên cơ sở dữ liệu, số cổng, ổ cắm unix và cuối cùng là cờ máy khách. Chúng tôi cần đặc quyền siêu người dùng để tạo cơ sở dữ liệu mới
MYSQL *con = mysql_init[NULL];2
$ ./version MySQL client version: 10.3.243 thực thi câu lệnh SQL. Trong trường hợp của chúng tôi, câu lệnh tạo cơ sở dữ liệu mới
MYSQL *con = mysql_init[NULL];3
Cuối cùng, chúng tôi đóng kết nối cơ sở dữ liệu
MYSQL *con = mysql_init[NULL];4
Đây là bằng chứng cho thấy cơ sở dữ liệu đã được tạo
MySQL C tạo và điền vào bảng
Trước khi tạo một bảng mới, chúng ta tạo một người dùng mà chúng ta sẽ sử dụng trong phần còn lại của hướng dẫn
MYSQL *con = mysql_init[NULL];5
Chúng tôi đã tạo một người dùng mới
$ ./version MySQL client version: 10.3.244
MYSQL *con = mysql_init[NULL];6
Ở đây chúng tôi cấp tất cả các đặc quyền cho ________ 94 trên cơ sở dữ liệu ________ 38
Ví dụ mã tiếp theo tạo một bảng và chèn một số dữ liệu vào đó
MYSQL *con = mysql_init[NULL];7
Chúng tôi không sử dụng bất kỳ lệnh gọi hàm MySQL mới nào ở đây. Chúng tôi sử dụng lệnh gọi hàm
$ ./version MySQL client version: 10.3.243 để vừa tạo bảng vừa chèn dữ liệu vào đó
MYSQL *con = mysql_init[NULL];8
Để tránh sự lặp lại không cần thiết, chúng tôi tạo một hàm
$ ./version MySQL client version: 10.3.248 tùy chỉnh
MYSQL *con = mysql_init[NULL];9
Chúng tôi kết nối với cơ sở dữ liệu
$ c99 version.c -o version `mysql_config --cflags --libs`8. Tên người dùng là
$ ./version MySQL client version: 10.3.244 và mật khẩu là
MYSQL *con = mysql_init[NULL];01. Tham số thứ năm là tên cơ sở dữ liệu
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }0
Ở đây chúng ta tạo một bảng tên là
MYSQL *con = mysql_init[NULL];02. Nó có ba cột
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }1
Chúng tôi chèn một hàng vào bảng
MYSQL *con = mysql_init[NULL];02
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }2
Chúng tôi hiển thị các bảng trong cơ sở dữ liệu
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }3
Chúng tôi chọn tất cả dữ liệu từ bảng
MySQL C lấy dữ liệu
Trong ví dụ tiếp theo, chúng tôi truy xuất dữ liệu từ một bảng
Chúng ta cần làm các bước sau
- Tạo kết nối
- Thực hiện kiểm tra
- Lấy tập kết quả
- Tìm nạp tất cả các hàng có sẵn
- Giải phóng tập kết quả
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }4
Ví dụ hiển thị tất cả các hàng từ bảng ô tô
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }5
Chúng tôi thực hiện truy vấn lấy tất cả dữ liệu từ bảng xe ô tô
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }6
Chúng tôi nhận được tập kết quả bằng hàm
MYSQL *con = mysql_init[NULL];04.
MYSQL *con = mysql_init[NULL];05 là một cấu trúc để giữ một tập kết quả
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }7
Ta lấy số trường [cột] trong bảng
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }8
Chúng tôi tìm nạp các hàng và in chúng ra màn hình
#include #include #include int main[int argc, char **argv] { printf["MySQL client version: %s\n", mysql_get_client_info[]]; exit[0]; }9
Chúng tôi giải phóng tài nguyên
#include #include #include0
Đây là đầu ra
Id hàng được chèn lần cuối của MySQL C
Đôi khi, chúng ta cần xác định id của hàng được chèn cuối cùng. Chúng ta có thể xác định id hàng được chèn cuối cùng bằng cách gọi hàm
MYSQL *con = mysql_init[NULL];06. Hàm này chỉ hoạt động nếu chúng ta đã xác định một cột
MYSQL *con = mysql_init[NULL];07 trong bảng
#include #include #include1
Một bảng mới được tạo. Ba hàng được chèn vào bảng. Chúng tôi xác định id hàng được chèn cuối cùng
#include #include #include2
Cột
MYSQL *con = mysql_init[NULL];08 có loại
MYSQL *con = mysql_init[NULL];07
#include #include #include3
Hàm
MYSQL *con = mysql_init[NULL];06 trả về giá trị được tạo cho cột
MYSQL *con = mysql_init[NULL];07 bởi câu lệnh
MYSQL *con = mysql_init[NULL];2 hoặc
MYSQL *con = mysql_init[NULL];3 trước đó
#include #include #include4
Đây là đầu ra
Tiêu đề cột MySQL C
Trong ví dụ tiếp theo, chúng tôi truy xuất dữ liệu từ bảng và tên cột của nó
#include #include #include5
Chúng tôi in ba hàng đầu tiên từ bảng
MYSQL *con = mysql_init[NULL];02. Chúng tôi cũng bao gồm các tiêu đề cột
#include #include #include6
Cấu trúc
MYSQL *con = mysql_init[NULL];5 chứa thông tin về một trường, chẳng hạn như tên, loại và kích thước của trường. Giá trị trường không phải là một phần của cấu trúc này;
#include #include #include7
Hàng đầu tiên chứa các tiêu đề cột. Cuộc gọi
MYSQL *con = mysql_init[NULL];7 trả về cấu trúc
MYSQL *con = mysql_init[NULL];5. Chúng tôi lấy tên tiêu đề cột từ cấu trúc này
#include #include #include8
Đây là đầu ra của chương trình của chúng tôi
Nhiều câu lệnh MySQL C
Có thể thực thi nhiều câu lệnh SQL trong một truy vấn. Chúng ta phải đặt cờ
MYSQL *con = mysql_init[NULL];9 trong phương thức kết nối
#include #include #include9
Trong ví dụ này, chúng tôi thực hiện ba câu lệnh
MYSQL *con = mysql_init[NULL];00 trong một truy vấn
printf["MySQL client version: %s\n", mysql_get_client_info[]];0
Tùy chọn cuối cùng của phương thức
$ ./version MySQL client version: 10.3.240 là cờ khách hàng. Nó được sử dụng để kích hoạt các tính năng nhất định.
MYSQL *con = mysql_init[NULL];9 cho phép thực thi nhiều câu lệnh. Điều này bị tắt theo mặc định
printf["MySQL client version: %s\n", mysql_get_client_info[]];1
Truy vấn bao gồm ba câu lệnh
MYSQL *con = mysql_init[NULL];00. Chúng được phân tách bằng dấu chấm phẩy
MYSQL *con = mysql_init[NULL];04 ký tự. Ký tự gạch chéo ngược
MYSQL *con = mysql_init[NULL];05 được sử dụng để phân tách chuỗi thành hai dòng. Nó không có gì để làm với nhiều tuyên bố
printf["MySQL client version: %s\n", mysql_get_client_info[]];2
Đoạn mã được đặt giữa các câu lệnh do/while. Việc truy xuất dữ liệu sẽ được thực hiện trong nhiều chu kỳ. Chúng tôi truy xuất dữ liệu cho từng câu lệnh
MYSQL *con = mysql_init[NULL];00 riêng biệt
printf["MySQL client version: %s\n", mysql_get_client_info[]];3
Chúng tôi mong đợi nhiều bộ kết quả. Do đó, chúng tôi gọi hàm
MYSQL *con = mysql_init[NULL];07. Nó đọc kết quả câu lệnh tiếp theo và trả về một trạng thái để cho biết liệu có tồn tại nhiều kết quả hay không. Hàm trả về 0 nếu quá trình thực thi diễn ra suôn sẻ và có nhiều kết quả hơn. Nó trả về -1, khi nó được thực thi OK và không còn kết quả nào nữa. Cuối cùng, nó trả về giá trị lớn hơn 0 nếu xảy ra lỗi
printf["MySQL client version: %s\n", mysql_get_client_info[]];4
Chúng tôi kiểm tra lỗi
printf["MySQL client version: %s\n", mysql_get_client_info[]];5
đầu ra ví dụ
Hình ảnh chèn MySQL C
Một số người thích đưa hình ảnh của họ vào cơ sở dữ liệu, một số thích giữ chúng trên hệ thống tệp cho các ứng dụng của họ. Khó khăn kỹ thuật phát sinh khi chúng tôi làm việc với nhiều hình ảnh. Hình ảnh là dữ liệu nhị phân. Cơ sở dữ liệu MySQL có một kiểu dữ liệu đặc biệt để lưu trữ dữ liệu nhị phân được gọi là
MYSQL *con = mysql_init[NULL];08 [Đối tượng lớn nhị phân]
printf["MySQL client version: %s\n", mysql_get_client_info[]];6
Đối với các ví dụ của chúng tôi, chúng tôi tạo một bảng
MYSQL *con = mysql_init[NULL];09 mới. Kích thước hình ảnh có thể lên tới 16 MB. Nó được xác định bởi kiểu dữ liệu
MYSQL *con = mysql_init[NULL];10
printf["MySQL client version: %s\n", mysql_get_client_info[]];7
Trong ví dụ này, chúng tôi chèn một hình ảnh vào bảng
MYSQL *con = mysql_init[NULL];11
printf["MySQL client version: %s\n", mysql_get_client_info[]];8
Bao gồm này là dành cho chức năng
MYSQL *con = mysql_init[NULL];12
printf["MySQL client version: %s\n", mysql_get_client_info[]];9
Ở đây chúng tôi mở tệp hình ảnh. Trong thư mục làm việc hiện tại, chúng ta nên có tệp
MYSQL *con = mysql_init[NULL];13
exit[0];0
Ta di chuyển con trỏ tệp về cuối tệp bằng hàm
MYSQL *con = mysql_init[NULL];14. Chúng tôi sẽ xác định kích thước của hình ảnh. Nếu xảy ra lỗi, chỉ báo lỗi được đặt. Chúng tôi kiểm tra chỉ báo bằng chức năng
MYSQL *con = mysql_init[NULL];14. Trong trường hợp có lỗi, chúng tôi cũng đóng trình xử lý tệp đã mở
exit[0];1
Đối với các luồng nhị phân, hàm
MYSQL *con = mysql_init[NULL];16 trả về số byte từ đầu tệp, e. g. kích thước của tập tin hình ảnh. Trong trường hợp có lỗi, hàm trả về -1 và errno được đặt. Hàm
MYSQL *con = mysql_init[NULL];17 diễn giải giá trị của errno dưới dạng thông báo lỗi và in nó ra luồng đầu ra lỗi tiêu chuẩn
exit[0];2
Trong mảng này, chúng ta sẽ lưu trữ dữ liệu hình ảnh
exit[0];3
Ta đọc dữ liệu từ con trỏ tệp và lưu vào mảng dữ liệu. Tổng số phần tử được đọc thành công được trả về
exit[0];4
Sau khi dữ liệu được đọc, chúng ta có thể đóng trình xử lý tệp
exit[0];5
Hàm
MYSQL *con = mysql_init[NULL];18 thêm một ký tự thoát, dấu gạch chéo ngược,
MYSQL *con = mysql_init[NULL];05, trước một số ký tự nguy hiểm tiềm ẩn nhất định trong một chuỗi được truyền vào hàm. Điều này có thể giúp ngăn chặn các cuộc tấn công SQL injection. Bộ đệm mới phải dài ít nhất
MYSQL *con = mysql_init[NULL];20
exit[0];6
Ở đây chúng ta bắt đầu xây dựng câu lệnh SQL. Chúng tôi xác định kích thước của chuỗi SQL bằng hàm
MYSQL *con = mysql_init[NULL];12
exit[0];7
Truy vấn phải đủ dài để chứa kích thước của câu lệnh chuỗi SQL và kích thước của tệp hình ảnh. Sử dụng hàm
MYSQL *con = mysql_init[NULL];22, chúng tôi ghi đầu ra được định dạng vào bộ đệm truy vấn
exit[0];8
Chúng tôi thực hiện truy vấn bằng hàm
MYSQL *con = mysql_init[NULL];23. Không thể sử dụng
$ ./version MySQL client version: 10.3.243 cho các câu lệnh chứa dữ liệu nhị phân;
MySQL C chọn hình ảnh
Trong ví dụ trước, chúng ta đã chèn một hình ảnh vào cơ sở dữ liệu. Trong ví dụ sau, chúng tôi chọn hình ảnh được chèn từ cơ sở dữ liệu
exit[0];9
Trong ví dụ này, chúng tôi tạo một tệp hình ảnh từ cơ sở dữ liệu
$ c99 version.c -o version `mysql_config --cflags --libs`0
Chúng tôi mở một trình xử lý tệp mới để viết
$ c99 version.c -o version `mysql_config --cflags --libs`1
Chúng tôi chọn cột
MYSQL *con = mysql_init[NULL];26 từ bảng
MYSQL *con = mysql_init[NULL];11 với
MYSQL *con = mysql_init[NULL];08 1
$ c99 version.c -o version `mysql_config --cflags --libs`2
Hàng chứa dữ liệu thô
$ c99 version.c -o version `mysql_config --cflags --libs`3
Chúng tôi nhận được chiều dài của hình ảnh
$ c99 version.c -o version `mysql_config --cflags --libs`4
Chúng tôi ghi dữ liệu đã truy xuất vào đĩa bằng lệnh gọi hàm
MYSQL *con = mysql_init[NULL];29. Chúng tôi kiểm tra chỉ báo lỗi bằng chức năng
MYSQL *con = mysql_init[NULL];30
exit[0];4
Sau khi chúng tôi ghi dữ liệu hình ảnh, chúng tôi đóng trình xử lý tệp bằng hàm
MYSQL *con = mysql_init[NULL];31
Đây là hướng dẫn MySQL C API. Bạn cũng có thể quan tâm đến hướng dẫn PyMySQL, hướng dẫn MySQL Visual Basic hoặc hướng dẫn mysqli PHP, hướng dẫn PostgreSQL C hoặc hướng dẫn SQLite C trên ZetCode