Nếu bạn không viết mã trên chính RPi, chẳng hạn như đang phát triển bằng Eclipse cho windows, bạn cần sao chép các tệp thư viện mysql nếu chuỗi công cụ biên dịch chéo của bạn không có chúng
Những điều sau đây không dựa trên bất kỳ kiến thức chuyên môn nào của chúng tôi, thay vào đó, nó là kết quả của quá trình thử và sai của chúng tôi bằng búa cho đến khi nó hoạt động…
1 – Lấy các tập tin tiêu đềSao chép thư mục này trên RPi
/usr/include/mysql
vào thư mục dự án của bạn. Sử dụng cái này để đưa nó vào tệp mã C của bạn
#include "mysql/mysql.h"
2 – Tạo tệp đối tượngTạo một tệp có tên chính. c chứa một số mã sử dụng thư viện mysql, e. g. cái này
#include
#include
#include
#include
int main[int argc, char **argv]
{
MYSQL *mysql1;
mysql1 = mysql_init[NULL];
}
Lưu nó vào một thư mục trên RPI, sau đó trên dòng lệnh, hãy chuyển đến thư mục đó và sử dụng thư mục này để biên dịch nó
g++ main.c `mysql_config --cflags` `mysql_config --libs`
Bây giờ sử dụng cái này để tìm ra thư mục được sử dụng
mysql_config --libs
Đối với chúng tôi nó mang lại điều này
-L/usr/lib/arm-linux-gnueabihf -lmysqlclient -lpthread -lz -lm -lrt -ldl
Vì vậy, từ thư mục
/usr/lib/arm-linux-gnueabihf
sao chép các tập tin
libmysqlclient. a
libmysqlclient. vì vậy
[cũng có các tệp libmysqlclient_r. a và libmysqlclient_r. vì vậy trong đó nhưng chúng tôi không bận tâm đến họ]
Dán chúng vào thư mục máy windows của bạn
C. \cygwin\opt\cross\x-tools\arm-unknown-linux-gnueabi\arm-unknown-linux-gnueabi\sysroot\usr\lib\
Bây giờ trong nhật thực, nhấp chuột phải vào dự án của bạn> Thuộc tính> Bản dựng C/C++> Cài đặt> Trình liên kết Cygwin C++> Thư viện. Thêm một mục nhập thư viện mới
mysqlclient
Điều này hoạt động nhưng việc xây dựng dự án không thành công vì thư viện tham chiếu đến các tệp khác cũng cần được thêm vào. Đối với chúng tôi, các tệp được liệt kê trong cảnh báo bản dựng nhật thực, tất cả chúng tôi đều ở trong thư mục này
/lib/arm-linux-gnueabihf/
Nhưng nếu bạn cần tìm kiếm cài đặt và sử dụng mlocate để tìm chúng trên RPi
Tìm từng cái và sao chép nó vào cùng một thư mục thư viện cửa sổ cygwin. Đây là những tập tin chúng tôi cần
ld-linux. Vì thế. 3
ld-linux-armhf. Vì thế. 3
libmysqlclient. a
libmysqlclient. vì vậy
libz. Vì thế. 1
Vậy là xong, đối với chúng tôi, điều này hoạt động tốt với rasbian và chúng tôi có thể truy cập cơ sở dữ liệu mysql của mình mà không gặp vấn đề gì. Tôi đoán nếu thư viện mysql được cập nhật trên RPi thì các tệp có thể cần phải được tìm thấy và sao chép lại, vì vậy cần lưu ý điều gì đó nếu sự cố xuất hiện sau khi cập nhật RPi
CÓ ÍCH?
Chúng tôi hưởng lợi rất nhiều từ các tài nguyên trên web, vì vậy chúng tôi quyết định nên thử và cung cấp lại một số kiến thức và tài nguyên của mình cho cộng đồng bằng cách mở nhiều ghi chú và thư viện nội bộ của công ty chúng tôi thông qua các trang web nhỏ như thế này. Chúng tôi hy vọng bạn tìm thấy trang web hữu ích
Vui lòng bình luận nếu bạn có thể thêm trợ giúp vào trang này hoặc chỉ ra các vấn đề và giải pháp bạn đã tìm thấy, nhưng xin lưu ý rằng chúng tôi không cung cấp hỗ trợ trên trang này. Nếu bạn cần trợ giúp về một vấn đề, vui lòng sử dụng một trong nhiều diễn đàn trực tuyến
Mã API C được phân phối với MySQL. Nó được bao gồm trong thư viện mysqlclient và cho phép các chương trình C truy cập cơ sở dữ liệu
Nhiều ứng dụng khách trong bản phân phối nguồn MySQL được viết bằng C. Nếu bạn đang tìm kiếm các ví dụ minh họa cách sử dụng API C, hãy xem các ứng dụng khách này. Bạn có thể tìm thấy những thứ này trong thư mục máy khách trong bản phân phối nguồn MySQL
Hầu hết các API máy khách khác [tất cả ngoại trừ Java] đều sử dụng thư viện mysqlclient để giao tiếp với máy chủ MySQL. Điều này có nghĩa là, chẳng hạn, bạn có thể tận dụng nhiều biến môi trường giống nhau được sử dụng bởi các chương trình máy khách khác vì chúng được tham chiếu từ thư viện. Xem Phần 4. 8, để biết danh sách các biến này
Máy khách có kích thước bộ đệm giao tiếp tối đa. Kích thước của bộ đệm được phân bổ ban đầu [16K byte] sẽ tự động tăng lên đến kích thước tối đa [tối đa là 16M]. Bởi vì kích thước bộ đệm chỉ được tăng lên khi có yêu cầu, nên việc chỉ tăng giới hạn tối đa mặc định không tự nó gây ra nhiều tài nguyên hơn được sử dụng. Kiểm tra kích thước này chủ yếu là kiểm tra các truy vấn và gói liên lạc bị lỗi
Bộ đệm giao tiếp phải đủ lớn để chứa một câu lệnh SQL [đối với lưu lượng từ máy khách đến máy chủ] và một hàng dữ liệu được trả về [đối với lưu lượng từ máy chủ đến máy khách]. Bộ đệm giao tiếp của mỗi luồng được tự động mở rộng để xử lý mọi truy vấn hoặc hàng lên đến giới hạn tối đa. Ví dụ: nếu bạn có các giá trị BLOB chứa tối đa 16M dữ liệu, thì bạn phải có giới hạn bộ đệm giao tiếp ít nhất là 16M [ở cả máy chủ và máy khách]. Mức tối đa mặc định của máy khách là 16M, nhưng mức tối đa mặc định trong máy chủ là 1M. Bạn có thể tăng giá trị này bằng cách thay đổi giá trị của tham số max_allowed_packet khi khởi động máy chủ. Nhìn thấy
Máy chủ MySQL thu nhỏ từng bộ đệm giao tiếp thành byte net_buffer_length sau mỗi truy vấn. Đối với máy khách, kích thước của bộ đệm được liên kết với kết nối không bị giảm cho đến khi đóng kết nối, lúc đó bộ nhớ máy khách được thu hồi
Để lập trình với chủ đề, xem. Để tạo một ứng dụng độc lập bao gồm “máy chủ” và “máy khách” trong cùng một chương trình [và không giao tiếp với máy chủ MySQL bên ngoài], hãy xem
MYSQL
Cấu trúc này đại diện cho một tay cầm cho một kết nối cơ sở dữ liệu. Nó được sử dụng cho hầu hết các chức năng của MySQL
MYSQL_RESCấu trúc này biểu thị kết quả của một truy vấn trả về các hàng [CHỌN, HIỂN THỊ, MÔ TẢ, GIẢI THÍCH]. Thông tin trả về từ một truy vấn được gọi là tập hợp kết quả trong phần còn lại của phần này
MYSQL_ROWĐây là biểu diễn an toàn kiểu của một hàng dữ liệu. Nó hiện được triển khai dưới dạng một mảng các chuỗi byte được tính. [Bạn không thể coi đây là các chuỗi kết thúc null nếu giá trị trường có thể chứa dữ liệu nhị phân vì các giá trị đó có thể chứa byte null bên trong. ] Các hàng có được bằng cách gọi mysql_fetch_row[]
MYSQL_FIELDCấu trúc này 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. Các thành viên của nó được mô tả chi tiết hơn sau. Bạn có thể lấy cấu trúc MYSQL_FIELD cho từng trường bằng cách gọi mysql_fetch_field[ ] nhiều lần. Giá trị trường không phải là một phần của cấu trúc này;
MYSQL_FIELD_OFFSETĐây là một biểu diễn an toàn kiểu của phần bù trong danh sách trường MySQL [được sử dụng bởi mysql_field_seek[ ]]. Độ lệch là số trường trong một hàng, bắt đầu từ số không
my_ulonglongLoại được sử dụng cho số hàng và cho mysql_affected_rows[], mysql_num_rows[] và mysql_insert_id[]. Loại này cung cấp phạm vi từ 0 đến 1. 84e19
Trên một số hệ thống, việc cố gắng in một giá trị kiểu my_ulonglong sẽ không hoạt động. Để in một giá trị như vậy, hãy chuyển đổi nó thành unsigned long và sử dụng định dạng in %lu. Ví dụ
printf [Number of rows: %lu\n", [unsigned long] mysql_num_rows[result]];
Cấu trúc MYSQL_FIELD chứa các thành viên sau
tên nhân vật
Tên của trường, dưới dạng một chuỗi kết thúc null
bảng ký tự *Tên của bảng chứa trường này, nếu đó không phải là trường được tính toán. Đối với các trường được tính toán, giá trị bảng là một chuỗi trống
ký tự * chắc chắnGiá trị mặc định của trường này, dưới dạng một chuỗi kết thúc null. Điều này chỉ được đặt nếu bạn sử dụng mysql_list_fields[ ]
enum enum_field_types loạiLoại trường. Giá trị loại có thể là một trong những điều sau đây
nhập giá trị
Loại mô tả
FIELD_TYPE_TINY
trường TINYINT
FIELD_TYPE_SHORT
trường NHỎ
FIELD_TYPE_LONG
trường số nguyên
FIELD_TYPE_INT24
trường TRUNG BÌNH
FIELD_TYPE_LONGLONG
trường LỚN
FIELD_TYPE_DECIMAL
trường DECIMAL hoặc NUMERIC
FIELD_TYPE_FLOAT
trường NỔI
FIELD_TYPE_DOUBLE
Trường NHÂN ĐÔI hoặc THỰC
FIELD_TYPE_TIMESTAMP
trường DẤU THỜI GIAN
FIELD_TYPE_DATE
trường NGÀY
FIELD_TYPE_TIME
trường THỜI GIAN
FIELD_TYPE_DATETIME
trường DATETIME
FIELD_TYPE_YEAR
trường NĂM
FIELD_TYPE_STRING
Trường chuỗi [CHAR hoặc VARCHAR]
FIELD_TYPE_BLOB
Trường BLOB hoặc TEXT [sử dụng max_length để xác định độ dài tối đa]
FIELD_TYPE_SET
trường ĐẶT
FIELD_TYPE_ENUM
trường ENUM
FIELD_TYPE_NULL
trường kiểu NULL
FIELD_TYPE_CHAR
Không dùng nữa;
Bạn có thể sử dụng macro IS_NUM[ ] để kiểm tra xem một trường có kiểu số hay không. Truyền giá trị loại cho IS_NUM[ ] và nó sẽ đánh giá là TRUE nếu trường là số
if [IS_NUM[field->type]] printf["Field is numeric\n"];độ dài int không dấu
Chiều rộng của trường, như được chỉ định trong định nghĩa bảng
không dấu int max_lengthChiều rộng tối đa của trường cho tập kết quả [độ dài của giá trị trường dài nhất cho các hàng thực sự trong tập kết quả]. Nếu bạn sử dụng mysql_store_result[ ] hoặc mysql_list_fields[ ], phần này chứa độ dài tối đa cho trường. Nếu bạn sử dụng mysql_use_result[], giá trị của biến này bằng không
cờ int không dấuCác cờ bit khác nhau cho trường. Giá trị cờ có thể có 0 hoặc nhiều bit sau được đặt
Giá trị cờ
Mô tả cờ
NOT_NULL_FLAG
Trường không được NULL
PRI_KEY_FLAG
Trường là một phần của khóa chính
UNIQUE_KEY_FLAG
Trường là một phần của khóa duy nhất
MULTIPLE_KEY_FLAG
Trường là một phần của khóa không phải là duy nhất
UNSIGNED_FLAG
Trường có thuộc tính UNSIGNED
ZEROFILL_FLAG
Trường có thuộc tính ZEROFILL
BINARY_FLAG
Trường có thuộc tính BINARY
AUTO_INCREMENT_FLAG
Trường có thuộc tính AUTO_INCREMENT
ENUM_FLAG
Trường là một ENUM [không dùng nữa]
BỘ CỜ
Trường là một SET [không dùng nữa]
BLOB_FLAG
Trường là BLOB hoặc TEXT [không dùng nữa]
TIMESTAMP_FLAG
Trường là DẤU THỜI GIAN [không dùng nữa]
Việc sử dụng các cờ BLOB_FLAG, ENUM_FLAG, SET_FLAG và TIMESTAMP_FLAG không được dùng nữa vì chúng biểu thị loại trường chứ không phải là thuộc tính của loại trường đó. Thay vào đó, tốt hơn là kiểm tra trường->nhập theo FIELD_TYPE_BLOB, FIELD_TYPE_ENUM, FIELD_TYPE_SET hoặc FIELD_TYPE_TIMESTAMP
Ví dụ sau minh họa cách sử dụng thông thường của giá trị cờ
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];
Bạn có thể sử dụng các macro tiện lợi sau để xác định trạng thái boolean của giá trị cờ
trạng thái cờ
Sự miêu tả
IS_NOT_NULL[cờ]
Đúng nếu trường này được định nghĩa là NOT NULL
IS_PRI_KEY[cờ]
Đúng nếu trường này là khóa chính
IS_BLOB[cờ]
Đúng nếu trường này là BLOB hoặc TEXT [không dùng nữa; trường kiểm tra->nhập thay thế]
số thập phân int không dấuSố thập phân cho trường số
Các chức năng có sẵn trong C API được liệt kê tiếp theo và được mô tả chi tiết hơn trong phần sau. Nhìn thấy
Chức năng
Sự miêu tả
mysql_affected_rows[ ]
Trả về số hàng được thay đổi/xóa/chèn bởi truy vấn CẬP NHẬT, XÓA hoặc CHÈN cuối cùng
mysql_change_user[]
Thay đổi người dùng và cơ sở dữ liệu trên một kết nối mở
ký tự mysql_set_name[]
Trả về tên của bộ ký tự mặc định cho kết nối
mysql_close[]
Đóng kết nối máy chủ
mysql_connect[]
Kết nối với máy chủ MySQL. Chức năng này không được dùng nữa;
mysql_create_db[]
Tạo một cơ sở dữ liệu. Chức năng này không được dùng nữa;
mysql_data_seek[]
Tìm kiếm một hàng tùy ý trong tập hợp kết quả truy vấn
mysql_debug[]
Có DBUG_PUSH với chuỗi đã cho
mysql_drop_db[]
Đánh rơi cơ sở dữ liệu. Chức năng này không được dùng nữa;
mysql_dump_debug_info[ ]
Làm cho máy chủ ghi thông tin gỡ lỗi vào nhật ký
mysql_eof[]
Xác định xem hàng cuối cùng của tập kết quả đã được đọc chưa. Chức năng này không được dùng nữa;
mysql_errno[]
Trả về số lỗi cho hàm MySQL được gọi gần đây nhất
mysql_error[]
Trả về thông báo lỗi cho chức năng MySQL được gọi gần đây nhất
mysql_escape_string[]
Thoát các ký tự đặc biệt trong chuỗi để sử dụng trong câu lệnh SQL
mysql_fetch_field[]
Trả về kiểu của trường bảng tiếp theo
mysql_fetch_field_direct[]
Trả về loại trường bảng, được cung cấp một số trường
mysql_fetch_fields[]
Trả về một mảng gồm tất cả các cấu trúc trường
mysql_fetch_lengths[]
Trả về độ dài của tất cả các cột trong hàng hiện tại
mysql_fetch_row[]
Tìm nạp hàng tiếp theo từ tập kết quả
mysql_field_seek[]
Đặt con trỏ cột trên một cột được chỉ định
mysql_field_count[]
Trả về số cột kết quả cho truy vấn gần đây nhất
mysql_field_tell[]
Trả về vị trí của con trỏ trường được sử dụng cho mysql_fetch_field[ ] cuối cùng
mysql_free_result[]
Giải phóng bộ nhớ được sử dụng bởi tập kết quả
mysql_get_client_info[ ]
Trả về thông tin phiên bản máy khách
mysql_get_host_info[ ]
Trả về một chuỗi mô tả kết nối
mysql_get_proto_info[ ]
Trả về phiên bản giao thức được kết nối sử dụng
mysql_get_server_info[ ]
Trả về số phiên bản máy chủ
mysql_info[ ]
Trả về thông tin về truy vấn được thực hiện gần đây nhất
mysql_init[]
Nhận hoặc khởi tạo cấu trúc MySQL
mysql_insert_id[]
Trả về ID được tạo cho cột AUTO_INCREMENT theo truy vấn trước đó
mysql_kill[]
Giết một chủ đề nhất định
mysql_list_dbs[]
Trả về tên cơ sở dữ liệu khớp với một biểu thức chính quy đơn giản
mysql_list_fields[]
Trả về tên trường khớp với một biểu thức chính quy đơn giản
mysql_list_processes[ ]
Trả về danh sách các chủ đề máy chủ hiện tại
mysql_list_tables[]
Trả về tên bảng khớp với một biểu thức chính quy đơn giản
mysql_num_fields[]
Trả về số cột trong một tập hợp kết quả
mysql_num_rows[]
Trả về số hàng trong tập kết quả
mysql_options[ ]
Đặt tùy chọn kết nối cho mysql_connect[]
mysql_ping[]
Kiểm tra xem kết nối đến máy chủ có hoạt động hay không, kết nối lại khi cần thiết
mysql_query[]
Thực thi một truy vấn SQL được chỉ định dưới dạng chuỗi kết thúc null
mysql_real_connect[]
Kết nối với máy chủ MySQL
mysql_real_escape_string[]
Thoát các ký tự đặc biệt trong một chuỗi để sử dụng trong câu lệnh SQL, có tính đến bộ ký tự hiện tại của kết nối
mysql_real_query[]
Thực thi một truy vấn SQL được chỉ định dưới dạng một chuỗi được tính
mysql_reload[]
Yêu cầu máy chủ tải lại các bảng cấp
mysql_row_seek[]
Tìm kiếm một hàng trong tập hợp kết quả, sử dụng giá trị được trả về từ mysql_row_tell[ ]
mysql_row_tell[]
Trả về vị trí con trỏ hàng
mysql_select_db[]
Chọn một cơ sở dữ liệu
mysql_shutdown[]
Tắt máy chủ cơ sở dữ liệu
mysql_stat[]
Trả về trạng thái máy chủ dưới dạng chuỗi
mysql_store_result[]
Truy xuất một tập hợp kết quả hoàn chỉnh cho khách hàng
mysql_thread_id[]
Trả về ID chủ đề hiện tại
mysql_thread_safe[]
Trả về 1 nếu các máy khách được biên dịch thành luồng an toàn
mysql_use_result[]
Bắt đầu truy xuất tập kết quả theo từng hàng
Để kết nối với máy chủ, hãy gọi mysql_init[] để khởi tạo trình xử lý kết nối, sau đó gọi mysql_real_connect[] với trình xử lý đó [cùng với các thông tin khác như tên máy chủ, tên người dùng và mật khẩu]. Khi kết nối, mysql_real_connect[] đặt cờ kết nối lại [một phần của cấu trúc MYSQL] thành giá trị 1. Cờ này cho biết, trong trường hợp không thể thực hiện truy vấn do mất kết nối, hãy thử kết nối lại với máy chủ trước khi từ bỏ. Khi bạn kết nối xong, hãy gọi mysql_close[ ] để chấm dứt kết nối
Trong khi kết nối đang hoạt động, máy khách có thể gửi các truy vấn SQL đến máy chủ bằng cách sử dụng mysql_query[] hoặc mysql_real_query[]. Sự khác biệt giữa hai loại này là mysql_query[] mong đợi truy vấn được chỉ định dưới dạng chuỗi kết thúc null, trong khi mysql_real_query[] mong đợi một chuỗi được tính. Nếu chuỗi chứa dữ liệu nhị phân [có thể bao gồm byte rỗng], bạn phải sử dụng mysql_real_query[ ]
Đối với mỗi truy vấn không CHỌN [ví dụ: CHÈN, CẬP NHẬT, XÓA], bạn có thể biết có bao nhiêu hàng đã bị thay đổi [bị ảnh hưởng] bằng cách gọi mysql_affected_rows[ ]
Đối với các truy vấn CHỌN, bạn truy xuất các hàng đã chọn dưới dạng tập hợp kết quả. [Lưu ý rằng một số câu lệnh giống như CHỌN ở chỗ chúng trả về các hàng. Chúng bao gồm HIỂN THỊ, MÔ TẢ và GIẢI THÍCH. Chúng nên được xử lý giống như các câu lệnh SELECT. ]
Có hai cách để khách hàng xử lý tập hợp kết quả. Một cách là truy xuất toàn bộ tập hợp kết quả cùng một lúc bằng cách gọi mysql_store_result[ ]. Hàm này lấy từ máy chủ tất cả các hàng được truy vấn trả về và lưu trữ chúng trong máy khách. Cách thứ hai là để khách hàng bắt đầu truy xuất tập kết quả theo từng hàng bằng cách gọi mysql_use_result[ ]. Hàm này khởi tạo truy xuất, nhưng không thực sự lấy bất kỳ hàng nào từ máy chủ
Trong cả hai trường hợp, bạn truy cập các hàng bằng cách gọi mysql_fetch_row[]. Với mysql_store_result[], mysql_fetch_row[] truy cập các hàng đã được tải xuống từ máy chủ. Với mysql_use_result[], mysql_fetch_row[] thực sự truy xuất hàng từ máy chủ. Thông tin về kích thước của dữ liệu trong mỗi hàng có sẵn bằng cách gọi mysql_fetch_lengths[ ]
Sau khi bạn hoàn thành tập kết quả, hãy gọi mysql_free_result[ ] để giải phóng bộ nhớ được sử dụng cho nó
Hai cơ chế truy xuất là bổ sung cho nhau. Các chương trình khách hàng nên chọn cách tiếp cận phù hợp nhất với yêu cầu của họ. Trên thực tế, khách hàng có xu hướng sử dụng mysql_store_result[] phổ biến hơn
Một lợi thế của mysql_store_result[ ] là vì tất cả các hàng đã được tải về máy khách, nên bạn không chỉ có thể truy cập các hàng một cách tuần tự mà còn có thể di chuyển qua lại trong tập kết quả bằng cách sử dụng mysql_data_seek[ ] hoặc mysql_row_seek[ ] để thay đổi . Bạn cũng có thể biết có bao nhiêu hàng bằng cách gọi mysql_num_rows[ ]. Mặt khác, yêu cầu bộ nhớ cho mysql_store_result[ ] có thể rất cao đối với các tập kết quả lớn và do đó, bạn có nhiều khả năng gặp phải tình trạng hết bộ nhớ
Một lợi thế của mysql_use_result[ ] là máy khách yêu cầu ít bộ nhớ hơn cho tập kết quả vì nó chỉ duy trì một hàng tại một thời điểm [và vì có ít chi phí phân bổ hơn nên mysql_use_result[ ] có thể nhanh hơn]. Nhược điểm là bạn phải xử lý từng hàng một cách nhanh chóng để tránh làm nghẽn máy chủ, bạn không có quyền truy cập ngẫu nhiên vào các hàng trong tập kết quả [bạn chỉ có thể truy cập các hàng theo tuần tự] và bạn không biết có bao nhiêu hàng trong tập kết quả. . Hơn nữa, bạn phải truy xuất tất cả các hàng ngay cả khi bạn xác định trong quá trình truy xuất giữa chừng rằng bạn đã tìm thấy thông tin mà mình đang tìm kiếm
API giúp khách hàng có thể phản hồi thích hợp với các truy vấn [chỉ truy xuất các hàng khi cần thiết] mà không cần biết liệu truy vấn đó có phải là CHỌN hay không. Bạn có thể làm điều này bằng cách gọi mysql_store_result[] sau mỗi mysql_query[] [hoặc mysql_real_query[]]. Nếu lệnh gọi tập kết quả thành công, truy vấn là CHỌN và bạn có thể đọc các hàng. Nếu cuộc gọi tập hợp kết quả không thành công, hãy gọi mysql_field_count[ ] để xác định xem kết quả có thực sự được mong đợi hay không. Nếu mysql_field_count[ ] trả về 0, thì truy vấn không trả về dữ liệu nào [cho biết đó là lệnh CHÈN, CẬP NHẬT, XÓA, v.v. ] và dự kiến sẽ không trả về các hàng. Nếu mysql_field_count[ ] khác 0, thì truy vấn lẽ ra phải trả về các hàng, nhưng không. Điều này chỉ ra rằng truy vấn là CHỌN không thành công. Xem mô tả cho mysql_field_count[ ] để biết ví dụ về cách thực hiện điều này
Cả mysql_store_result[ ] và mysql_use_result[ ] đều cho phép bạn lấy thông tin về các trường tạo nên tập kết quả [số lượng trường, tên và loại của chúng, v.v. ]. Bạn có thể truy cập thông tin trường liên tục trong hàng bằng cách gọi mysql_fetch_field[ ] nhiều lần hoặc theo số trường trong hàng bằng cách gọi mysql_fetch_field_direct[ ]. Vị trí con trỏ trường hiện tại có thể được thay đổi bằng cách gọi mysql_field_seek[ ]. Đặt con trỏ trường ảnh hưởng đến các cuộc gọi tiếp theo tới mysql_fetch_field[ ]. Bạn cũng có thể nhận thông tin cho tất cả các trường cùng một lúc bằng cách gọi mysql_fetch_fields[ ]
Để phát hiện và báo cáo lỗi, MySQL cung cấp quyền truy cập vào thông tin lỗi bằng các hàm mysql_errno[ ] và mysql_error[ ]. Chúng trả về mã lỗi hoặc thông báo lỗi cho hàm được gọi gần đây nhất có thể thành công hoặc không thành công, cho phép bạn xác định thời điểm xảy ra lỗi và lỗi đó là gì
Mô tả chức năng API C
Trong các mô tả sau đây, một tham số hoặc giá trị trả về của NULL có nghĩa là NULL theo nghĩa của ngôn ngữ lập trình C, không phải là giá trị NULL của MySQL
Các hàm trả về một giá trị thường trả về một con trỏ hoặc một số nguyên. Trừ khi được quy định khác, các hàm trả về một con trỏ sẽ trả về giá trị khác NULL để biểu thị thành công hoặc giá trị NULL để biểu thị lỗi và các hàm trả về số nguyên trả về 0 để biểu thị thành công hoặc khác 0 để biểu thị lỗi. Lưu ý rằng "khác không" chỉ có nghĩa là. Trừ khi mô tả chức năng nói khác, không kiểm tra đối với một giá trị khác 0
________số 8Khi một hàm trả về lỗi, tiểu mục Lỗi của phần mô tả hàm sẽ liệt kê các loại lỗi có thể xảy ra. Bạn có thể tìm ra cái nào trong số này xảy ra bằng cách gọi mysql_errno[ ]. Một biểu diễn chuỗi của lỗi có thể thu được bằng cách gọi mysql_error[ ]
my_ulonglong mysql_affected_rows[MYSQL *mysql]
Trả về số hàng được thay đổi bởi lần CẬP NHẬT cuối cùng, bị xóa bởi lần XÓA cuối cùng hoặc được chèn bởi câu lệnh INSERT cuối cùng. Có thể được gọi ngay sau mysql_query[ ] đối với các câu lệnh CẬP NHẬT, XÓA hoặc CHÈN. Đối với các câu lệnh CHỌN, mysql_affected_rows[ ] hoạt động giống như mysql_num_rows[ ]
Một số nguyên lớn hơn 0 cho biết số hàng bị ảnh hưởng hoặc được truy xuất. Số 0 cho biết rằng không có bản ghi nào được cập nhật cho câu lệnh CẬP NHẬT, không có hàng nào khớp với mệnh đề WHERE trong truy vấn hoặc chưa có truy vấn nào được thực hiện. -1 cho biết rằng truy vấn đã trả về lỗi hoặc đối với truy vấn CHỌN, mysql_affected_rows[ ] đã được gọi trước khi gọi mysql_store_result[ ]
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];
Nếu một người chỉ định cờ CLIENT_FOUND_ROWS khi kết nối với mysqld, mysql_affected_rows[ ] sẽ trả về số hàng khớp với câu lệnh WHERE cho các câu lệnh CẬP NHẬT
Lưu ý rằng khi một người sử dụng lệnh REPLACE, mysql_affected_rows[ ] sẽ trả về 2 nếu hàng mới thay thế hàng cũ. Điều này là do trong trường hợp này, một hàng đã được chèn vào và sau đó hàng trùng lặp đã bị xóa
my_bool mysql_change_user[MYSQL *mysql, const char *người dùng, const char *mật khẩu, const char *db]
Thay đổi người dùng và khiến cơ sở dữ liệu được chỉ định bởi db trở thành cơ sở dữ liệu mặc định [hiện tại] trên kết nối được chỉ định bởi mysql. Trong các truy vấn tiếp theo, cơ sở dữ liệu này là mặc định cho các tham chiếu bảng không bao gồm bộ xác định cơ sở dữ liệu rõ ràng
Chức năng này đã được giới thiệu trong MySQL Phiên bản 3. 23. 3
mysql_change_user[ ] không thành công trừ khi người dùng được kết nối có thể được xác thực hoặc nếu anh ta không có quyền sử dụng cơ sở dữ liệu. Trong trường hợp này, người dùng và cơ sở dữ liệu không bị thay đổi
Tham số db có thể được đặt thành NULL nếu bạn không muốn có cơ sở dữ liệu mặc định
Số không cho thành công. Khác không nếu xảy ra lỗi
Điều tương tự mà bạn có thể nhận được từ mysql_real_connect[ ]
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
ER_UNKNOWN_COM_ERRORMáy chủ MySQL không thực hiện lệnh này [có thể là máy chủ cũ]
ER_ACCESS_DENIED_ERRORNgười dùng hoặc mật khẩu đã sai
ER_BAD_DB_ERRORCơ sở dữ liệu không tồn tại
ER_DBACCESS_DENIED_ERRORNgười dùng không có quyền truy cập vào cơ sở dữ liệu
ER_WRONG_DB_NAMETên cơ sở dữ liệu quá dài
#include "mysql/mysql.h"
0ký tự mysql_set_name[]
const char *mysql_character_set_name[MYSQL *mysql]
Trả về bộ ký tự mặc định cho kết nối hiện tại
Bộ ký tự mặc định
vô hiệu mysql_close[MYSQL *mysql]
Đóng kết nối đã mở trước đó. mysql_close[ ] cũng phân bổ xử lý kết nối được trỏ bởi mysql nếu xử lý được cấp phát tự động bởi mysql_init[ ] hoặc mysql_connect[ ]
MYSQL *mysql_connect[MYSQL *mysql, const char *host, const char *user, const char *passwd]
Chức năng này không được dùng nữa. Thay vào đó, tốt hơn là sử dụng mysql_real_connect[ ]
mysql_connect[ ] cố gắng thiết lập kết nối tới cơ sở dữ liệu MySQL đang chạy trên máy chủ. mysql_connect[ ] phải hoàn tất thành công trước khi bạn có thể thực thi bất kỳ chức năng API nào khác, ngoại trừ mysql_get_client_info[ ]
Ý nghĩa của các tham số giống như đối với các tham số tương ứng cho mysql_real_connect[ ] với điểm khác biệt là tham số kết nối có thể là NULL. Trong trường hợp này, API C tự động phân bổ bộ nhớ cho cấu trúc kết nối và giải phóng nó khi bạn gọi mysql_close[]. Nhược điểm của phương pháp này là bạn không thể truy xuất thông báo lỗi nếu kết nối không thành công. [Để lấy thông tin lỗi từ mysql_errno[] hoặc mysql_error[], bạn phải cung cấp một con trỏ MYSQL hợp lệ. ]
Tương tự như đối với mysql_real_connect[]
Tương tự như đối với mysql_real_connect[]
int mysql_create_db[MYSQL *mysql, const char *db]
Tạo cơ sở dữ liệu được đặt tên theo tham số db
Chức năng này không được dùng nữa. Thay vào đó, tốt hơn là sử dụng mysql_query[ ] để đưa ra câu lệnh SQL CREATE DATABASE
Không nếu cơ sở dữ liệu được tạo thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
#include "mysql/mysql.h"
1void mysql_data_seek[MYSQL_RES *result, my_ulonglong offset]
Tìm kiếm một hàng tùy ý trong tập hợp kết quả truy vấn. Điều này yêu cầu cấu trúc tập kết quả chứa toàn bộ kết quả của truy vấn, do đó, mysql_data_seek[ ] chỉ có thể được sử dụng cùng với mysql_store_result[ ], không được sử dụng với mysql_use_result[ ]
Phần bù phải là một giá trị trong phạm vi từ 0 đến mysql_num_rows[result]-1
void mysql_debug[const char *debug]
Có DBUG_PUSH với chuỗi đã cho. mysql_debug[ ] sử dụng thư viện gỡ lỗi Fred Fish. Để sử dụng chức năng này, bạn phải biên dịch thư viện máy khách để hỗ trợ gỡ lỗi. Xem , và Phần D. 2
Cuộc gọi sau khiến thư viện máy khách tạo tệp theo dõi trong
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...0 trên máy khách
#include "mysql/mysql.h"
3int mysql_drop_db[MYSQL *mysql, const char *db]
Bỏ cơ sở dữ liệu được đặt tên theo tham số db
Chức năng này không được dùng nữa. Thay vào đó, tốt hơn là sử dụng mysql_query[ ] để đưa ra câu lệnh SQL DROP DATABASE
Không nếu cơ sở dữ liệu đã bị loại bỏ thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
#include "mysql/mysql.h"
4int mysql_dump_debug_info[MYSQL *mysql]
Hướng dẫn máy chủ ghi một số thông tin gỡ lỗi vào nhật ký. Người dùng được kết nối phải có đặc quyền xử lý để điều này hoạt động
Không nếu lệnh thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
my_bool mysql_eof[MYSQL_RES *kết quả]
Chức năng này không được dùng nữa. mysql_errno[ ] hoặc mysql_error[ ] có thể được sử dụng thay thế
mysql_eof[ ] xác định xem hàng cuối cùng của tập kết quả đã được đọc chưa
Nếu bạn nhận được một tập hợp kết quả từ một cuộc gọi thành công đến mysql_store_result[ ], thì máy khách sẽ nhận được toàn bộ tập hợp trong một thao tác. Trong trường hợp này, trả về NULL từ mysql_fetch_row[ ] luôn có nghĩa là đã đạt đến cuối tập kết quả và không cần thiết phải gọi mysql_eof[ ]. Khi được sử dụng với mysql_store_result[], mysql_eof[] sẽ luôn trả về true
Mặt khác, nếu bạn sử dụng mysql_use_result[ ] để bắt đầu truy xuất tập hợp kết quả, các hàng của tập hợp sẽ được lấy từ máy chủ từng cái một khi bạn gọi mysql_fetch_row[ ] nhiều lần. Vì có thể xảy ra lỗi trên kết nối trong quá trình này, nên giá trị trả về NULL từ mysql_fetch_row[ ] không nhất thiết có nghĩa là kết thúc tập hợp kết quả đã đạt được bình thường. Trong trường hợp này, bạn có thể sử dụng mysql_eof[] để xác định điều gì đã xảy ra. mysql_eof[ ] trả về một giá trị khác 0 nếu đạt đến cuối tập kết quả và 0 nếu xảy ra lỗi
Về mặt lịch sử, mysql_eof[ ] có trước các hàm lỗi MySQL tiêu chuẩn mysql_errno[ ] và mysql_error[ ]. Bởi vì các hàm báo lỗi đó cung cấp cùng một thông tin nên việc sử dụng chúng được ưu tiên hơn mysql_eof[], hiện không được dùng nữa. [Trên thực tế, chúng cung cấp nhiều thông tin hơn vì mysql_eof[] chỉ trả về một giá trị boolean trong khi các hàm báo lỗi cho biết lý do xảy ra lỗi khi xảy ra lỗi. ]
Không nếu không có lỗi xảy ra. Khác không nếu đã đạt đến cuối tập kết quả
Ví dụ sau đây cho thấy cách bạn có thể sử dụng mysql_eof[]
#include "mysql/mysql.h"
5Tuy nhiên, bạn có thể đạt được hiệu quả tương tự với các hàm báo lỗi tiêu chuẩn của MySQL
if [IS_NUM[field->type]] printf["Field is numeric\n"];0
int không dấu mysql_errno[MYSQL *mysql]
Đối với kết nối do mysql chỉ định, mysql_errno[ ] trả về mã lỗi cho hàm API được gọi gần đây nhất có thể thành công hoặc thất bại. Giá trị trả về bằng 0 có nghĩa là không có lỗi xảy ra. Số thông báo lỗi máy khách được liệt kê trong tệp tiêu đề MySQL
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...1. Số thông báo lỗi máy chủ được liệt kê trong
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...2. Trong bản phân phối nguồn MySQL, bạn có thể tìm thấy danh sách đầy đủ các thông báo lỗi và số lỗi trong tệp
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...3
Giá trị mã lỗi. Không nếu không có lỗi xảy ra
char *mysql_error[MYSQL *mysql]
Đối với kết nối được chỉ định bởi mysql, mysql_error[ ] trả về thông báo lỗi cho hàm API được gọi gần đây nhất có thể thành công hoặc thất bại. Một chuỗi rỗng [" "] được trả về nếu không có lỗi xảy ra. Điều này có nghĩa là hai bài kiểm tra sau đây là tương đương
if [IS_NUM[field->type]] printf["Field is numeric\n"];1
Ngôn ngữ của thông báo lỗi máy khách có thể được thay đổi bằng cách biên dịch lại thư viện máy khách MySQL. Hiện tại bạn có thể chọn thông báo lỗi bằng nhiều ngôn ngữ khác nhau. Nhìn thấy
Một chuỗi ký tự mô tả lỗi. Một chuỗi rỗng nếu không có lỗi xảy ra
Thay vào đó, bạn nên sử dụng mysql_real_escape_string[ ]
Hàm này giống với mysql_real_escape_string[] ngoại trừ việc mysql_real_escape_string[] lấy một trình xử lý kết nối làm đối số đầu tiên của nó và thoát khỏi chuỗi theo bộ ký tự hiện tại. mysql_escape_string[ ] không nhận đối số kết nối và không tôn trọng cài đặt bộ ký tự hiện tại
MYSQL_FIELD *mysql_fetch_field[MYSQL_RES *kết quả]
Trả về định nghĩa của một cột của tập kết quả dưới dạng cấu trúc MYSQL_FIELD. Gọi hàm này nhiều lần để lấy thông tin về tất cả các cột trong tập kết quả. mysql_fetch_field[ ] trả về NULL khi không còn trường nào
mysql_fetch_field[ ] được đặt lại để trả về thông tin về trường đầu tiên mỗi khi bạn thực hiện truy vấn CHỌN mới. Trường được trả về bởi mysql_fetch_field[ ] cũng bị ảnh hưởng bởi các lệnh gọi tới mysql_field_seek[ ]
Nếu bạn đã gọi mysql_query[ ] để thực hiện CHỌN trên một bảng nhưng chưa gọi mysql_store_result[ ], MySQL sẽ trả về độ dài blob mặc định [8K byte] nếu bạn gọi mysql_fetch_field[ ] để hỏi độ dài của trường BLOB. [Kích thước 8K được chọn vì MySQL không biết độ dài tối đa cho BLOB. Điều này nên được thực hiện cấu hình đôi khi. ] Khi bạn đã truy xuất tập kết quả, trường->max_length chứa độ dài của giá trị lớn nhất cho cột này trong truy vấn cụ thể
Cấu trúc MYSQL_FIELD cho cột hiện tại. NULL nếu không còn cột nào
if [IS_NUM[field->type]] printf["Field is numeric\n"];2
MYSQL_FIELD *mysql_fetch_fields[MYSQL_RES *kết quả]
Trả về một mảng gồm tất cả các cấu trúc MYSQL_FIELD cho tập kết quả. Mỗi cấu trúc cung cấp định nghĩa trường cho một cột của tập hợp kết quả
Một mảng cấu trúc MYSQL_FIELD cho tất cả các cột của tập kết quả
if [IS_NUM[field->type]] printf["Field is numeric\n"];3
mysql_fetch_field_direct[]
MYSQL_FIELD *mysql_fetch_field_direct[kết quả MYSQL_RES *, trường int không dấu]
Đưa ra một số trường fieldnr cho một cột trong tập hợp kết quả, trả về định nghĩa trường của cột đó dưới dạng cấu trúc MYSQL_FIELD. Bạn có thể sử dụng chức năng này để truy xuất định nghĩa cho một cột tùy ý. Giá trị của fieldnr phải nằm trong khoảng từ 0 đến mysql_num_fields[result]-1
Cấu trúc MYSQL_FIELD cho cột được chỉ định
if [IS_NUM[field->type]] printf["Field is numeric\n"];4
dài không dấu *mysql_fetch_lengths[MYSQL_RES *kết quả]
Trả về độ dài của các cột của hàng hiện tại trong một tập hợp kết quả. Nếu bạn dự định sao chép các giá trị trường, thông tin độ dài này cũng hữu ích cho việc tối ưu hóa vì bạn có thể tránh gọi hàm strlen[ ]. Ngoài ra, nếu tập kết quả chứa dữ liệu nhị phân, bạn phải sử dụng chức năng này để xác định kích thước của dữ liệu vì strlen[] trả về kết quả không chính xác cho bất kỳ trường nào chứa ký tự null
Độ dài của cột trống và cột chứa giá trị NULL bằng 0. Để biết cách phân biệt hai trường hợp này, hãy xem phần mô tả cho mysql_fetch_row[ ]
Một mảng các số nguyên dài không dấu đại diện cho kích thước của mỗi cột [không bao gồm bất kỳ ký tự null kết thúc nào]. NULL nếu xảy ra lỗi
mysql_fetch_lengths[ ] chỉ hợp lệ cho hàng hiện tại của tập kết quả. Nó trả về NULL nếu bạn gọi nó trước khi gọi mysql_fetch_row[ ] hoặc sau khi truy xuất tất cả các hàng trong kết quả
if [IS_NUM[field->type]] printf["Field is numeric\n"];5
MYSQL_ROW mysql_fetch_row[MYSQL_RES *kết quả]
Truy xuất hàng tiếp theo của tập kết quả. Khi được sử dụng sau mysql_store_result[], mysql_fetch_row[] trả về NULL khi không còn hàng để truy xuất. Khi được sử dụng sau mysql_use_result[], mysql_fetch_row[] trả về NULL khi không còn hàng để truy xuất hoặc nếu xảy ra lỗi
Số lượng giá trị trong hàng được cung cấp bởi mysql_num_fields[result]. Nếu hàng giữ giá trị trả về từ lệnh gọi mysql_fetch_row[ ], con trỏ tới các giá trị được truy cập dưới dạng hàng[0] tới hàng[mysql_num_fields[result]-1]. Giá trị NULL trong hàng được biểu thị bằng con trỏ NULL
Độ dài của các giá trị trường trong hàng có thể thu được bằng cách gọi mysql_fetch_lengths[ ]. Các trường trống và các trường chứa NULL đều có độ dài 0; . Nếu con trỏ là NULL, trường là NULL;
Cấu trúc MYSQL_ROW cho hàng tiếp theo. NULL nếu không còn hàng để truy xuất hoặc nếu xảy ra lỗi
CR_SERVER_LOST
Kết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
if [IS_NUM[field->type]] printf["Field is numeric\n"];6
int không dấu mysql_field_count[MYSQL *mysql]
Nếu bạn đang sử dụng phiên bản MySQL cũ hơn Phiên bản 3. 22. 24, thay vào đó, bạn nên sử dụng unsigned int mysql_num_fields[MYSQL *mysql]
Trả về số lượng cột cho truy vấn gần đây nhất trên kết nối
Cách sử dụng bình thường của chức năng này là khi mysql_store_result[ ] trả về NULL [và do đó bạn không có con trỏ tập hợp kết quả]. Trong trường hợp này, bạn có thể gọi mysql_field_count[ ] để xác định xem mysql_store_result[ ] có tạo ra kết quả không trống hay không. Điều này cho phép chương trình máy khách thực hiện hành động thích hợp mà không cần biết liệu truy vấn có phải là câu lệnh CHỌN [hoặc giống như CHỌN] hay không. Ví dụ sau đây minh họa cách điều này có thể được thực hiện
.
Một số nguyên không dấu đại diện cho số trường trong một tập hợp kết quả
if [IS_NUM[field->type]] printf["Field is numeric\n"];7
Một cách khác là thay thế cuộc gọi mysql_field_count[&mysql] bằng mysql_errno[&mysql]. Trong trường hợp này, bạn đang kiểm tra trực tiếp lỗi từ mysql_store_result[ ] thay vì suy luận từ giá trị của mysql_field_count[ ] xem câu lệnh có phải là SELECT hay không
MYSQL_FIELD_OFFSET mysql_field_seek[kết quả MYSQL_RES *, phần bù MYSQL_FIELD_OFFSET]
Đặt con trỏ trường thành phần bù đã cho. Cuộc gọi tiếp theo đến mysql_fetch_field[ ] sẽ truy xuất định nghĩa trường của cột được liên kết với phần bù đó
Để tìm đến đầu hàng, hãy chuyển giá trị offset bằng 0
Giá trị trước đó của con trỏ trường
MYSQL_FIELD_OFFSET mysql_field_tell[MYSQL_RES *kết quả]
Trả về vị trí của con trỏ trường được sử dụng cho mysql_fetch_field[ ] cuối cùng. Giá trị này có thể được sử dụng làm đối số cho mysql_field_seek[ ]
Độ lệch hiện tại của con trỏ trường
void mysql_free_result[MYSQL_RES *kết quả]
Giải phóng bộ nhớ được phân bổ cho kết quả được đặt bởi mysql_store_result[], mysql_use_result[], mysql_list_dbs[], v.v. Khi bạn làm xong một tập kết quả, bạn phải giải phóng bộ nhớ mà nó sử dụng bằng cách gọi mysql_free_result[ ]
char *mysql_get_client_info[void]
Trả về một chuỗi đại diện cho phiên bản thư viện máy khách
Một chuỗi ký tự đại diện cho phiên bản thư viện máy khách MySQL
char *mysql_get_host_info[MYSQL *mysql]
Trả về một chuỗi mô tả loại kết nối đang sử dụng, bao gồm tên máy chủ
Một chuỗi ký tự đại diện cho tên máy chủ và loại kết nối
int không dấu mysql_get_proto_info[MYSQL *mysql]
Trả về phiên bản giao thức được sử dụng bởi kết nối hiện tại
Một số nguyên không dấu đại diện cho phiên bản giao thức được sử dụng bởi kết nối hiện tại
char *mysql_get_server_info[MYSQL *mysql]
Trả về một chuỗi đại diện cho số phiên bản máy chủ
Một chuỗi ký tự đại diện cho số phiên bản máy chủ
char *mysql_info[MYSQL *mysql]
Truy xuất một chuỗi cung cấp thông tin về truy vấn được thực hiện gần đây nhất, nhưng chỉ cho các câu lệnh sau. Đối với các câu lệnh khác, mysql_info[] trả về NULL. Định dạng của chuỗi khác nhau tùy thuộc vào loại truy vấn. Các con số chỉ mang tính minh họa;
CHÈN VÀO. LỰA CHỌN
định dạng chuỗi. Hồ sơ. 100 bản sao. 0 cảnh báo. 0
CHÈN VÀO. GIÁ TRỊ [. ],[. ],[. ]định dạng chuỗi. Hồ sơ. 3 bản sao. 0 cảnh báo. 0
TẢI DỮ LIỆU VÀO TẬP TINđịnh dạng chuỗi. Hồ sơ. 1 Đã xóa. 0 Đã bỏ qua. 0 cảnh báo. 0
THAY ĐỔI BẢNGđịnh dạng chuỗi. Hồ sơ. 3 bản sao. 0 cảnh báo. 0
CẬP NHẬTđịnh dạng chuỗi. Hàng phù hợp. 40 đã thay đổi. 40 cảnh báo. 0
Lưu ý rằng mysql_info[ ] trả về giá trị không NULL cho INSERT. Câu lệnh GIÁ TRỊ chỉ khi nhiều danh sách giá trị được chỉ định trong câu lệnh
Một chuỗi ký tự đại diện cho thông tin bổ sung về truy vấn được thực hiện gần đây nhất. NULL nếu không có thông tin cho truy vấn
MYSQL *mysql_init[MYSQL *mysql]
Cấp phát hoặc khởi tạo một đối tượng MySQL phù hợp với mysql_real_connect[]. Nếu mysql là một con trỏ NULL, hàm sẽ cấp phát, khởi tạo và trả về một đối tượng mới. Mặt khác, đối tượng được khởi tạo và địa chỉ của đối tượng được trả về. Nếu mysql_init[ ] cấp phát một đối tượng mới, nó sẽ được giải phóng khi mysql_close[ ] được gọi để đóng kết nối
Một trình điều khiển MYSQL* được khởi tạo. NULL nếu không đủ bộ nhớ để phân bổ một đối tượng mới
Trong trường hợp không đủ bộ nhớ, NULL được trả về
my_ulonglong mysql_insert_id[MYSQL *mysql]
Trả về ID được tạo cho cột AUTO_INCREMENT theo truy vấn trước đó. Sử dụng hàm này sau khi bạn đã thực hiện truy vấn INSERT vào bảng có chứa trường AUTO_INCREMENT
Lưu ý rằng mysql_insert_id[ ] trả về 0 nếu truy vấn trước đó không tạo ra giá trị AUTO_INCREMENT. Nếu bạn cần lưu giá trị cho lần sau, hãy nhớ gọi mysql_insert_id[ ] ngay sau truy vấn tạo ra giá trị
mysql_insert_id[ ] được cập nhật sau các câu lệnh INSERT và UPDATE tạo ra giá trị AUTO_INCREMENT hoặc đặt giá trị cột thành LAST_INSERT_ID[expr]. Nhìn thấy
Cũng xin lưu ý rằng giá trị của hàm SQL LAST_INSERT_ID[ ] luôn chứa giá trị AUTO_INCREMENT được tạo gần đây nhất và không được đặt lại giữa các truy vấn vì giá trị của hàm đó được duy trì trong máy chủ
Giá trị của trường AUTO_INCREMENT đã được cập nhật bởi truy vấn trước đó. Trả về 0 nếu không có truy vấn trước đó trên kết nối hoặc nếu truy vấn không cập nhật giá trị AUTO_INCREMENT
int mysql_kill[MYSQL *mysql, pid dài không dấu]
Yêu cầu máy chủ hủy chuỗi được chỉ định bởi pid
Số không cho thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL_RES *mysql_list_dbs[MYSQL *mysql, const char *wild]
Trả về tập kết quả bao gồm các tên cơ sở dữ liệu trên máy chủ khớp với biểu thức chính quy đơn giản được chỉ định bởi tham số wild. wild có thể chứa các ký tự đại diện
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...4 hoặc
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...5 hoặc có thể là một con trỏ NULL để khớp với tất cả các cơ sở dữ liệu. Gọi mysql_list_dbs[ ] tương tự như thực hiện truy vấn SHOW cơ sở dữ liệu [LIKE wild]
Bạn phải giải phóng tập kết quả với mysql_free_result[ ]
Tập hợp kết quả MYSQL_RES để thành công. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_OUT_OF_MEMORYhết bộ nhớ
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL_RES *mysql_list_fields[MYSQL *mysql, const char *table, const char *wild]
Trả về một tập hợp kết quả bao gồm các tên trường trong bảng đã cho khớp với biểu thức chính quy đơn giản được chỉ định bởi tham số wild. wild có thể chứa các ký tự đại diện
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...4 hoặc
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...5 hoặc có thể là một con trỏ NULL để khớp với tất cả các trường. Gọi mysql_list_fields[ ] tương tự như thực hiện truy vấn SHOW COLUMNS FROM tbl_name [LIKE wild]
Lưu ý rằng bạn nên sử dụng SHOW COLUMNS FROM tbl_name thay vì mysql_list_fields[ ]
Bạn phải giải phóng tập kết quả với mysql_free_result[ ]
Tập hợp kết quả MYSQL_RES để thành công. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL_RES *mysql_list_processes[MYSQL *mysql]
Trả về tập kết quả mô tả các luồng máy chủ hiện tại. Đây là loại thông tin giống như thông tin được báo cáo bởi mysqladmin processlist hoặc truy vấn SHOW PROCESSLIST
Bạn phải giải phóng tập kết quả với mysql_free_result[ ]
Tập hợp kết quả MYSQL_RES để thành công. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL_RES *mysql_list_tables[MYSQL *mysql, const char *wild]
Trả về một tập hợp kết quả bao gồm các tên bảng trong cơ sở dữ liệu hiện tại khớp với biểu thức chính quy đơn giản được chỉ định bởi tham số wild. wild có thể chứa các ký tự đại diện
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...4 hoặc
if [result] /* correct */ .. error ... if [result < 0] /* incorrect */ .. error ... if [result == -1] /* incorrect */ .. error ...5 hoặc có thể là một con trỏ NULL để khớp với tất cả các bảng. Gọi mysql_list_tables[ ] tương tự như thực hiện truy vấn SHOW table [LIKE wild]
Bạn phải giải phóng tập kết quả với mysql_free_result[ ]
Tập hợp kết quả MYSQL_RES để thành công. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
unsigned int mysql_num_fields[MYSQL_RES *kết quả]
hoặc
không dấu int mysql_num_fields[MYSQL *mysql]
Biểu mẫu thứ hai không hoạt động trên MySQL Phiên bản 3. 22. 24 hoặc mới hơn. Để chuyển một đối số MYSQL*, bạn phải sử dụng unsigned int mysql_field_count[MYSQL *mysql] thay thế
Trả về số cột trong một tập hợp kết quả
Lưu ý rằng bạn có thể lấy số lượng cột từ một con trỏ đến một tập hợp kết quả hoặc đến một bộ điều khiển kết nối. Bạn sẽ sử dụng bộ điều khiển kết nối nếu mysql_store_result[] hoặc mysql_use_result[] trả về NULL [và do đó bạn không có con trỏ tập hợp kết quả]. Trong trường hợp này, bạn có thể gọi mysql_field_count[ ] để xác định xem mysql_store_result[ ] có tạo ra kết quả không trống hay không. Điều này cho phép chương trình máy khách thực hiện hành động thích hợp mà không cần biết liệu truy vấn có phải là câu lệnh CHỌN [hoặc giống như CHỌN] hay không. Ví dụ sau đây minh họa cách điều này có thể được thực hiện
.
Một số nguyên không dấu đại diện cho số trường trong một tập hợp kết quả
if [IS_NUM[field->type]] printf["Field is numeric\n"];8
Một cách khác [nếu bạn biết rằng truy vấn của bạn phải trả về một tập hợp kết quả] là thay thế lệnh gọi mysql_errno[&mysql] bằng một kiểm tra xem mysql_field_count[&mysql] có = 0 không. Điều này sẽ chỉ xảy ra nếu đã xảy ra sự cố
my_ulonglong mysql_num_rows[MYSQL_RES *kết quả]
Trả về số hàng trong tập kết quả
Việc sử dụng mysql_num_rows[ ] phụ thuộc vào việc bạn sử dụng mysql_store_result[ ] hay mysql_use_result[ ] để trả về tập kết quả. Nếu bạn sử dụng mysql_store_result[], mysql_num_rows[] có thể được gọi ngay lập tức. Nếu bạn sử dụng mysql_use_result[], mysql_num_rows[] sẽ không trả về giá trị đúng cho đến khi tất cả các hàng trong tập hợp kết quả đã được truy xuất
Số hàng trong tập kết quả
int mysql_options[MYSQL *mysql, tùy chọn enum mysql_option, const char *arg]
Có thể được sử dụng để đặt các tùy chọn kết nối bổ sung và ảnh hưởng đến hành vi của kết nối. Chức năng này có thể được gọi nhiều lần để thiết lập một số tùy chọn
mysql_options[ ] nên được gọi sau mysql_init[ ] và trước mysql_connect[] hoặc mysql_real_connect[ ]
Đối số tùy chọn là tùy chọn mà bạn muốn đặt; . Nếu tùy chọn là một số nguyên, arg sẽ trỏ đến giá trị của số nguyên
Giá trị tùy chọn có thể
Tùy chọn
loại đối số
Chức năng
MYSQL_OPT_CONNECT_TIMEOUT
int không dấu *
Thời gian chờ kết nối tính bằng giây
MYSQL_OPT_COMPRESS
Không được sử dụng
Sử dụng giao thức máy khách/máy chủ nén
MYSQL_OPT_LOCAL_INFILE
Con trỏ tùy chọn tới uint
Nếu không có con trỏ nào được đưa ra hoặc nếu con trỏ trỏ đến một int không dấu khác không. = 0, lệnh LOAD LOCAL INFILE được kích hoạt
MYSQL_OPT_NAMED_PIPE
Không được sử dụng
Sử dụng các đường dẫn có tên để kết nối với máy chủ MySQL trên NT
MYSQL_INIT_COMMAND
ký tự *
Lệnh thực thi khi kết nối với máy chủ MySQL. Sẽ tự động được thực hiện lại khi kết nối lại
MYSQL_READ_DEFAULT_FILE
ký tự *
Đọc các tùy chọn từ tệp tùy chọn được đặt tên thay vì từ
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];0
MYSQL_READ_DEFAULT_GROUP
ký tự *
Đọc các tùy chọn từ nhóm được đặt tên từ
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];0 hoặc tệp được chỉ định bằng MYSQL_READ_DEFAULT_FILE
Lưu ý rằng máy khách nhóm luôn được đọc nếu bạn sử dụng MYSQL_READ_DEFAULT_FILE hoặc MYSQL_READ_DEFAULT_GROUP
Nhóm được chỉ định trong tệp tùy chọn có thể chứa các tùy chọn sau
Tùy chọn
Sự miêu tả
hết thời gian kết nối
Thời gian chờ kết nối tính bằng giây. Trên Linux, thời gian chờ này cũng được sử dụng để chờ câu trả lời đầu tiên từ máy chủ
nén
Sử dụng giao thức máy khách/máy chủ nén
cơ sở dữ liệu
Kết nối với cơ sở dữ liệu này nếu không có cơ sở dữ liệu nào được chỉ định trong lệnh kết nối
gỡ lỗi
tùy chọn gỡ lỗi
vô hiệu hóa-local-infile
Vô hiệu hóa việc sử dụng LOAD DATA LOCAL
chủ nhà
tên máy chủ mặc định
init-lệnh
Lệnh thực thi khi kết nối với máy chủ MySQL. Sẽ tự động được thực hiện lại khi kết nối lại
thời gian chờ tương tác
Giống như chỉ định CLIENT_INTERACTIVE cho mysql_real_connect[]. Nhìn thấy
local-infile[=[0. 1]]
Nếu không tranh luận hoặc tranh luận. = 0, sau đó cho phép sử dụng LOAD DATA LOCAL
mật khẩu mở khóa
Mật khẩu mặc định
đường ống
Sử dụng các đường dẫn có tên để kết nối với máy chủ MySQL trên NT
Hải cảng
Số cổng mặc định
trả lại tìm thấy hàng
Yêu cầu mysql_info[ ] trả về các hàng đã tìm thấy thay vì các hàng được cập nhật khi sử dụng CẬP NHẬT
ổ cắm
Số ổ cắm mặc định
người dùng
Người dùng mặc định
Lưu ý rằng thời gian chờ đã được thay thế bằng thời gian chờ kết nối, nhưng thời gian chờ vẫn sẽ hoạt động trong một thời gian
Để biết thêm thông tin về các tệp tùy chọn, hãy xem
Số không cho thành công. Khác không nếu bạn đã sử dụng một tùy chọn không xác định
if [IS_NUM[field->type]] printf["Field is numeric\n"];9
Điều này yêu cầu máy khách sử dụng giao thức máy khách/máy chủ được nén và đọc các tùy chọn bổ sung từ phần odbc trong tệp
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];0
int mysql_ping[MYSQL *mysql]
Kiểm tra xem kết nối đến máy chủ có hoạt động không. Nếu nó bị hỏng, kết nối lại tự động sẽ được thực hiện
Chức năng này có thể được sử dụng bởi các máy khách không hoạt động trong một thời gian dài, để kiểm tra xem máy chủ đã đóng kết nối chưa và kết nối lại nếu cần
Không nếu máy chủ còn sống. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
int mysql_query[MYSQL *mysql, const char *truy vấn]
Thực thi truy vấn SQL được chỉ ra bởi truy vấn chuỗi kết thúc null. Truy vấn phải bao gồm một câu lệnh SQL duy nhất. Bạn không nên thêm dấu chấm phẩy kết thúc [
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];3] hoặc \g vào câu lệnh
mysql_query[] không thể được sử dụng cho các truy vấn chứa dữ liệu nhị phân; . [Dữ liệu nhị phân có thể chứa ký tự
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];4, mà mysql_query[ ] hiểu là phần cuối của chuỗi truy vấn. ]
Nếu bạn muốn biết liệu truy vấn có trả về tập kết quả hay không, bạn có thể sử dụng mysql_field_count[ ] để kiểm tra điều này. Nhìn thấy
Không nếu truy vấn thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL *mysql_real_connect[MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, cổng int không dấu, const char *unix_socket, int client_flag không dấu]
mysql_real_connect[ ] cố gắng thiết lập kết nối với công cụ cơ sở dữ liệu MySQL đang chạy trên máy chủ. mysql_real_connect[ ] phải hoàn tất thành công trước khi bạn có thể thực thi bất kỳ chức năng API nào khác, ngoại trừ mysql_get_client_info[ ]
Các thông số được quy định như sau
Tham số đầu tiên phải là địa chỉ của cấu trúc MYSQL hiện có. Trước khi gọi mysql_real_connect[] bạn phải gọi mysql_init[] để khởi tạo cấu trúc MYSQL. Bạn có thể thay đổi rất nhiều tùy chọn kết nối với lệnh gọi mysql_options[ ]. Nhìn thấy
Giá trị của máy chủ có thể là tên máy chủ hoặc địa chỉ IP. Nếu máy chủ là NULL hoặc chuỗi "localhost", kết nối với máy chủ cục bộ được giả định. Nếu HĐH hỗ trợ ổ cắm [Unix] hoặc đường dẫn có tên [Windows], chúng được sử dụng thay cho TCP/IP để kết nối với máy chủ
Tham số người dùng chứa ID đăng nhập MySQL của người dùng. Nếu người dùng là NULL, người dùng hiện tại được giả định. Trong Unix, đây là tên đăng nhập hiện tại. Trong Windows ODBC, tên người dùng hiện tại phải được chỉ định rõ ràng. Nhìn thấy
Tham số passwd chứa mật khẩu cho người dùng. Nếu passwd là NULL, chỉ các mục nhập trong bảng người dùng cho người dùng có trường mật khẩu trống [trống] mới được kiểm tra xem có khớp không. Điều này cho phép quản trị viên cơ sở dữ liệu thiết lập hệ thống đặc quyền MySQL theo cách mà người dùng có các đặc quyền khác nhau tùy thuộc vào việc họ có chỉ định mật khẩu hay không
Ghi chú. không cố mã hóa mật khẩu trước khi gọi mysql_real_connect[];
db là tên cơ sở dữ liệu. Nếu db không phải là NULL, kết nối sẽ đặt cơ sở dữ liệu mặc định thành giá trị này
Nếu cổng không phải là 0, giá trị sẽ được sử dụng làm số cổng cho kết nối TCP/IP. Lưu ý rằng tham số máy chủ xác định loại kết nối
Nếu unix_socket không phải là NULL, thì chuỗi chỉ định ổ cắm hoặc đường dẫn có tên sẽ được sử dụng. Lưu ý rằng tham số máy chủ xác định loại kết nối
Giá trị của client_flag thường là 0, nhưng có thể được đặt thành sự kết hợp của các cờ sau trong những trường hợp rất đặc biệt
Tên cờ
Mô tả cờ
CLIENT_COMPRESS
Sử dụng giao thức nén
CLIENT_FOUND_ROWS
Trả về số hàng tìm thấy [khớp], không phải số hàng bị ảnh hưởng
CLIENT_IGNORE_SPACE
Cho phép khoảng trắng sau tên chức năng. Làm cho tất cả các tên chức năng từ dành riêng
CLIENT_INTERACTIVE
Cho phép Interactive_timeout giây [thay vì wait_timeout giây] không hoạt động trước khi đóng kết nối
CLIENT_NO_SCHEMA
Không cho phép db_name. tbl_name. cú pháp col_name. Cái này dành cho ODBC. Nó khiến trình phân tích cú pháp tạo ra lỗi nếu bạn sử dụng cú pháp đó, cú pháp này rất hữu ích để bẫy lỗi trong một số chương trình ODBC
CLIENT_ODBC
Khách hàng là khách hàng ODBC. Điều này thay đổi mysqld để thân thiện với ODBC hơn
CLIENT_SSL
Sử dụng SSL [giao thức được mã hóa]
Xử lý kết nối MYSQL* nếu kết nối thành công, NULL nếu kết nối không thành công. Đối với kết nối thành công, giá trị trả về giống với giá trị của tham số đầu tiên
CR_CONN_HOST_ERROR
Không thể kết nối với máy chủ MySQL
CR_CONNECTION_ERRORKhông thể kết nối với máy chủ MySQL cục bộ
CR_IPSOCK_ERRORKhông thể tạo ổ cắm IP
CR_OUT_OF_MEMORYhết bộ nhớ
CR_SOCKET_CREATE_ERRORKhông thể tạo ổ cắm Unix
CR_UNKNOWN_HOSTKhông thể tìm thấy địa chỉ IP cho tên máy chủ
CR_VERSION_ERRORGiao thức không khớp do cố gắng kết nối với máy chủ bằng thư viện máy khách sử dụng phiên bản giao thức khác. Điều này có thể xảy ra nếu bạn sử dụng thư viện máy khách rất cũ để kết nối với máy chủ mới không được bắt đầu bằng tùy chọn --old-protocol
CR_NAMEDPIPEOPEN_ERRORKhông tạo được đường dẫn có tên trên Windows
CR_NAMEDPIPEWAIT_ERRORKhông đợi được đường dẫn có tên trên Windows
CR_NAMEDPIPESETSTATE_ERRORKhông tải được trình xử lý đường ống trên Windows
CR_SERVER_LOSTNếu connect_timeout > 0 và mất nhiều hơn connect_timeout giây để kết nối với máy chủ hoặc nếu máy chủ chết trong khi thực thi lệnh init
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];0
Bằng cách sử dụng mysql_options[ ], thư viện MySQL sẽ đọc các phần [client] và your_prog_name trong tệp
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];0, điều này sẽ đảm bảo rằng chương trình của bạn sẽ hoạt động, ngay cả khi ai đó đã thiết lập MySQL theo cách không chuẩn
Lưu ý rằng khi kết nối, mysql_real_connect[] đặt cờ kết nối lại [một phần của cấu trúc MYSQL] thành giá trị 1. Cờ này cho biết, trong trường hợp không thể thực hiện truy vấn do mất kết nối, bạn nên thử kết nối lại với máy chủ trước khi từ bỏ
mysql_real_escape_string[]
mysql_real_escape_string dài không dấu[MYSQL *mysql, char *to, const char *from, độ dài không dấu]
Hàm này được sử dụng để tạo một chuỗi SQL hợp pháp mà bạn có thể sử dụng trong một câu lệnh SQL. Nhìn thấy
Chuỗi trong từ được mã hóa thành chuỗi SQL đã thoát, có tính đến bộ ký tự hiện tại của kết nối. Kết quả được đặt vào và một byte null kết thúc được thêm vào. Các ký tự được mã hóa là NUL [ASCII 0],
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];6,
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];7,
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];8, ', “, và Control-Z [xem ]
Chuỗi được trỏ tới bởi from phải có độ dài byte dài. Bạn phải phân bổ bộ đệm để có độ dài ít nhất * 2 + 1 byte dài. [Trong trường hợp xấu hơn, mỗi ký tự có thể cần được mã hóa bằng cách sử dụng hai byte và bạn cần có chỗ cho byte null kết thúc. ] Khi mysql_escape_string[ ] trả về, nội dung của to sẽ là một chuỗi kết thúc null. Giá trị trả về là độ dài của chuỗi được mã hóa, không bao gồm ký tự null kết thúc
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];1
Hàm strmov[] được sử dụng trong ví dụ được bao gồm trong thư viện mysqlclient và hoạt động giống như hàm strcpy[] nhưng trả về một con trỏ tới null kết thúc của tham số đầu tiên
Độ dài của giá trị được đặt vào, không bao gồm ký tự null kết thúc
int mysql_real_query[MYSQL *mysql, const char *query, độ dài không dấu]
Thực thi truy vấn SQL được trỏ tới bởi truy vấn, truy vấn này phải là chuỗi có độ dài byte dài. Truy vấn phải bao gồm một câu lệnh SQL duy nhất. Bạn không nên thêm dấu chấm phẩy kết thúc [
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];3] hoặc \g vào câu lệnh
Bạn phải sử dụng mysql_real_query[] thay vì mysql_query[] cho các truy vấn chứa dữ liệu nhị phân vì dữ liệu nhị phân có thể chứa ký tự
mysql_query[&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10"]; printf["%ld products updated",[long] mysql_affected_rows[&mysql]];4. Ngoài ra, mysql_real_query[ ] nhanh hơn mysql_query[ ] vì nó không gọi strlen[ ] trên chuỗi truy vấn
Nếu bạn muốn biết liệu truy vấn có trả về tập kết quả hay không, bạn có thể sử dụng mysql_field_count[ ] để kiểm tra điều này. Nhìn thấy
Không nếu truy vấn thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
int mysql_reload[MYSQL *mysql]
Yêu cầu máy chủ MySQL tải lại các bảng cấp. Người dùng được kết nối phải có đặc quyền tải lại
Chức năng này không được dùng nữa. Thay vào đó, tốt hơn là sử dụng mysql_query[ ] để đưa ra câu lệnh SQL FLUSH PRIVILEGES
Số không cho thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL_ROW_OFFSET mysql_row_seek[kết quả MYSQL_RES *, phần bù MYSQL_ROW_OFFSET]
Đặt con trỏ hàng thành một hàng tùy ý trong tập hợp kết quả truy vấn. Điều này yêu cầu cấu trúc tập kết quả chứa toàn bộ kết quả của truy vấn, vì vậy mysql_row_seek[ ] chỉ có thể được sử dụng cùng với mysql_store_result[ ], không được sử dụng với mysql_use_result[ ]
Phần bù phải là một giá trị được trả về từ lệnh gọi tới mysql_row_tell[ ] hoặc tới mysql_row_seek[ ]. Giá trị này không chỉ đơn giản là một số hàng;
Giá trị trước đó của con trỏ hàng. Giá trị này có thể được chuyển đến lệnh gọi tiếp theo tới mysql_row_seek[ ]
MYSQL_ROW_OFFSET mysql_row_tell[MYSQL_RES *kết quả]
Trả về vị trí hiện tại của con trỏ hàng cho mysql_fetch_row[ ] cuối cùng. Giá trị này có thể được sử dụng làm đối số cho mysql_row_seek[ ]
Bạn chỉ nên sử dụng mysql_row_tell[] sau mysql_store_result[], không phải sau mysql_use_result[]
Độ lệch hiện tại của con trỏ hàng
int mysql_select_db[MYSQL *mysql, const char *db]
Làm cho cơ sở dữ liệu được chỉ định bởi db trở thành cơ sở dữ liệu [hiện tại] mặc định trên kết nối được chỉ định bởi mysql. Trong các truy vấn tiếp theo, cơ sở dữ liệu này là mặc định cho các tham chiếu bảng không bao gồm bộ xác định cơ sở dữ liệu rõ ràng
mysql_select_db[ ] không thành công trừ khi người dùng được kết nối có thể được xác thực là có quyền sử dụng cơ sở dữ liệu
Số không cho thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
int mysql_shutdown[MYSQL *mysql]
Yêu cầu máy chủ cơ sở dữ liệu tắt. Người dùng được kết nối phải có đặc quyền tắt máy
Số không cho thành công. Khác không nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
char *mysql_stat[MYSQL *mysql]
Trả về một chuỗi ký tự chứa thông tin tương tự như thông tin được cung cấp bởi lệnh trạng thái mysqladmin. Điều này bao gồm thời gian hoạt động tính bằng giây và số lượng chuỗi đang chạy, câu hỏi, tải lại và bảng đang mở
Một chuỗi ký tự mô tả trạng thái máy chủ. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
MYSQL_RES *mysql_store_result[MYSQL *mysql]
Bạn phải gọi mysql_store_result[ ] hoặc mysql_use_result[ ] cho mọi truy vấn truy xuất dữ liệu thành công [CHỌN, HIỂN THỊ, MÔ TẢ, GIẢI THÍCH]
Bạn không cần phải gọi mysql_store_result[ ] hoặc mysql_use_result[ ] cho các truy vấn khác, nhưng nó sẽ không gây hại hoặc gây ra bất kỳ hiệu suất đáng chú ý nào nếu bạn gọi mysql_store_result[ ] trong mọi trường hợp. Bạn có thể phát hiện xem truy vấn không có tập kết quả hay không bằng cách kiểm tra xem mysql_store_result[ ] có trả về 0 hay không [sẽ nói thêm về điều này sau]
Nếu bạn muốn biết liệu truy vấn có trả về tập kết quả hay không, bạn có thể sử dụng mysql_field_count[ ] để kiểm tra điều này. Nhìn thấy
mysql_store_result[ ] đọc toàn bộ kết quả của truy vấn tới máy khách, phân bổ cấu trúc MYSQL_RES và đặt kết quả vào cấu trúc này
mysql_store_result[ ] trả về một con trỏ rỗng nếu truy vấn không trả về tập kết quả [ví dụ: nếu truy vấn là câu lệnh INSERT]
mysql_store_result[ ] cũng trả về một con trỏ null nếu việc đọc tập kết quả không thành công. Bạn có thể kiểm tra xem mình có gặp lỗi hay không bằng cách kiểm tra xem mysql_error[] có trả về con trỏ null hay không, nếu mysql_errno[] trả về 0 hoặc nếu mysql_field_count[] trả về 0
Một tập hợp kết quả trống được trả về nếu không có hàng nào được trả về. [Tập hợp kết quả trống khác với con trỏ rỗng ở dạng giá trị trả về. ]
Khi bạn đã gọi mysql_store_result[ ] và nhận được kết quả trả về không phải là con trỏ rỗng, bạn có thể gọi mysql_num_rows[ ] để biết có bao nhiêu hàng trong tập kết quả
Bạn có thể gọi mysql_fetch_row[] để tìm nạp các hàng từ tập kết quả hoặc mysql_row_seek[] và mysql_row_tell[] để lấy hoặc đặt vị trí hàng hiện tại trong tập kết quả
Bạn phải gọi mysql_free_result[ ] sau khi hoàn thành tập hợp kết quả
.
Cấu trúc kết quả MYSQL_RES với kết quả. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_OUT_OF_MEMORYhết bộ nhớ
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
mysql_thread_id dài không dấu [MYSQL *mysql]
Trả về ID luồng của kết nối hiện tại. Giá trị này có thể được sử dụng làm đối số cho mysql_kill[ ] để hủy luồng
Nếu mất kết nối và bạn kết nối lại với mysql_ping[], ID luồng sẽ thay đổi. Điều này có nghĩa là bạn không nên lấy ID luồng và lưu trữ nó sau này. Bạn nên lấy nó khi bạn cần
ID luồng của kết nối hiện tại
MYSQL_RES *mysql_use_result[MYSQL *mysql]
Bạn phải gọi mysql_store_result[ ] hoặc mysql_use_result[ ] cho mọi truy vấn truy xuất dữ liệu thành công [CHỌN, HIỂN THỊ, MÔ TẢ, GIẢI THÍCH]
mysql_use_result[ ] bắt đầu truy xuất tập kết quả nhưng không thực sự đọc tập kết quả vào máy khách như mysql_store_result[ ] đã làm. Thay vào đó, mỗi hàng phải được truy xuất riêng lẻ bằng cách gọi hàm mysql_fetch_row[ ]. Điều này đọc kết quả của một truy vấn trực tiếp từ máy chủ mà không lưu trữ nó trong bảng tạm thời hoặc bộ đệm cục bộ, nhanh hơn một chút và sử dụng ít bộ nhớ hơn nhiều so với mysql_store_result[ ]. Máy khách sẽ chỉ phân bổ bộ nhớ cho hàng hiện tại và bộ đệm giao tiếp có thể tăng lên tới max_allowed_packet byte
Mặt khác, bạn không nên sử dụng mysql_use_result[ ] nếu bạn đang thực hiện nhiều xử lý cho từng hàng ở phía máy khách hoặc nếu đầu ra được gửi tới màn hình mà người dùng có thể nhập ^S [dừng cuộn . Điều này sẽ liên kết máy chủ và ngăn các luồng khác cập nhật bất kỳ bảng nào mà dữ liệu đang được tìm nạp
Khi sử dụng mysql_use_result[], bạn phải thực thi mysql_fetch_row[] cho đến khi giá trị NULL được trả về, nếu không, các hàng chưa tìm nạp sẽ được trả về như một phần của tập hợp kết quả cho truy vấn tiếp theo của bạn. API C sẽ báo lỗi Các lệnh không đồng bộ;
Bạn không thể sử dụng mysql_data_seek[], mysql_row_seek[], mysql_row_tell[], mysql_num_rows[] hoặc mysql_affected_rows[] với kết quả được trả về từ mysql_use_result[], bạn cũng không thể đưa ra các truy vấn khác cho đến khi mysql_use_result[] kết thúc. [Tuy nhiên, sau khi bạn đã tìm nạp tất cả các hàng, mysql_num_rows[] sẽ trả về chính xác số hàng đã tìm nạp. ]
Bạn phải gọi mysql_free_result[ ] sau khi hoàn thành tập hợp kết quả
Cấu trúc kết quả MYSQL_RES. NULL nếu xảy ra lỗi
CR_COMMANDS_OUT_OF_SYNC
Các lệnh được thực hiện không đúng thứ tự
CR_OUT_OF_MEMORYhết bộ nhớ
CR_SERVER_GONE_ERRORMáy chủ MySQL đã biến mất
CR_SERVER_LOSTKết nối với máy chủ bị mất trong khi truy vấn
CR_UNKNOWN_ERRORĐã xảy ra lỗi không xác định
C Mô tả chức năng luồng
Bạn cần sử dụng các chức năng sau khi muốn tạo một máy khách theo luồng. Nhìn thấy
Chức năng này cần được gọi một lần trong chương trình trước khi gọi bất kỳ chức năng MySQL nào. Điều này khởi tạo một số biến toàn cục mà MySQL cần. Nếu bạn đang sử dụng thư viện máy khách an toàn cho luồng, điều này cũng sẽ gọi mysql_thread_init[ ] cho luồng này
Điều này được gọi tự động bởi mysql_init[], mysql_server_init[] và mysql_connect[]
my_bool mysql_thread_init[void]
Hàm này cần được gọi cho mỗi luồng được tạo để khởi tạo các biến dành riêng cho luồng
Điều này được gọi tự động bởi my_init[] và mysql_connect[]
khoảng trống mysql_thread_end[khoảng trống]
Hàm này cần được gọi trước khi gọi pthread_exit[ ] để giải phóng bộ nhớ được cấp phát bởi mysql_thread_init[ ]
Lưu ý rằng chức năng này không được gọi tự động bởi thư viện máy khách. Nó phải được gọi rõ ràng để tránh rò rỉ bộ nhớ
int không dấu mysql_thread_safe[void]
Chức năng này cho biết liệu ứng dụng khách có được biên dịch thành luồng an toàn hay không
1 là máy khách an toàn cho luồng, 0 nếu không
Máy chủ nhúng C Mô tả chức năng
Bạn phải sử dụng các chức năng sau nếu muốn cho phép ứng dụng của mình được liên kết với thư viện máy chủ MySQL được nhúng. Nhìn thấy
Nếu chương trình được liên kết với -lmysqlclient thay vì -lmysqld, các chức năng này không làm gì cả. Điều này giúp bạn có thể lựa chọn giữa việc sử dụng máy chủ MySQL nhúng và máy chủ độc lập mà không cần sửa đổi bất kỳ mã nào
int mysql_server_init[int argc, char **argv, char **nhóm]
Chức năng này phải được gọi một lần trong chương trình trước khi gọi bất kỳ chức năng MySQL nào khác. Nó khởi động máy chủ và khởi tạo bất kỳ hệ thống con nào [mysys, InnoDB, v.v. ] mà máy chủ sử dụng. Nếu chức năng này không được gọi, chương trình sẽ bị lỗi. Nếu bạn đang sử dụng gói DBUG đi kèm với MySQL, bạn nên gọi gói này sau khi bạn đã gọi MY_INIT[ ]
Các đối số argc và argv tương tự như các đối số của hàm main[]. Phần tử đầu tiên của argv bị bỏ qua [nó thường chứa tên chương trình]. Để thuận tiện, argc có thể là 0 [không] nếu không có đối số dòng lệnh cho máy chủ
Danh sách các chuỗi kết thúc NULL trong nhóm chọn nhóm nào trong tệp tùy chọn sẽ hoạt động. Nhìn thấy. Để thuận tiện, các nhóm có thể là NULL, trong trường hợp đó, các nhóm [máy chủ] và [emedded] sẽ hoạt động
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];2
0 nếu ổn, 1 nếu xảy ra lỗi
khoảng trống mysql_server_end[khoảng trống]
Hàm này phải được gọi một lần trong chương trình sau tất cả các hàm khác của MySQL. Nó tắt máy chủ nhúng
Các câu hỏi và sự cố thường gặp khi sử dụng API C
Tại sao sau khi mysql_query[] Trả về Thành công, mysql_store_result[] Đôi khi Trả về NULL?
Có thể mysql_store_result[ ] trả về NULL sau khi gọi thành công mysql_query[ ]. Khi điều này xảy ra, điều đó có nghĩa là một trong những điều kiện sau đã xảy ra
Đã xảy ra lỗi malloc[] [ví dụ: nếu tập kết quả quá lớn]
Không thể đọc dữ liệu [xảy ra lỗi trên kết nối]
Truy vấn không trả về dữ liệu nào [ví dụ: đó là CHÈN, CẬP NHẬT hoặc XÓA]
Bạn luôn có thể kiểm tra xem câu lệnh có tạo ra kết quả không trống hay không bằng cách gọi mysql_field_count[ ]. Nếu mysql_field_count[ ] trả về 0, thì kết quả trống và truy vấn cuối cùng là một câu lệnh không trả về giá trị [ví dụ: CHÈN hoặc XÓA]. Nếu mysql_field_count[ ] trả về một giá trị khác 0, câu lệnh sẽ tạo ra kết quả không trống. Xem mô tả về hàm mysql_field_count[ ] để biết ví dụ
Bạn có thể kiểm tra lỗi bằng cách gọi mysql_error[] hoặc mysql_errno[]
Tôi có thể nhận được kết quả gì từ một truy vấn?
Ngoài tập kết quả được trả về bởi một truy vấn, bạn cũng có thể nhận được thông tin sau
mysql_affected_rows[ ] trả về số hàng bị ảnh hưởng bởi truy vấn cuối cùng khi thực hiện CHÈN, CẬP NHẬT hoặc XÓA. Một ngoại lệ là nếu XÓA được sử dụng mà không có mệnh đề WHERE, thì bảng được tạo lại trống, nhanh hơn nhiều. Trong trường hợp này, mysql_affected_rows[ ] trả về 0 cho số bản ghi bị ảnh hưởng
mysql_num_rows[ ] trả về số hàng trong tập kết quả. Với mysql_store_result[], mysql_num_rows[] có thể được gọi ngay khi mysql_store_result[] trả về. Với mysql_use_result[], mysql_num_rows[] chỉ có thể được gọi sau khi bạn đã tìm nạp tất cả các hàng với mysql_fetch_row[]
mysql_insert_id[ ] trả về ID được tạo bởi truy vấn cuối cùng đã chèn một hàng vào bảng có chỉ số AUTO_INCREMENT. Nhìn thấy
Một số truy vấn [LOAD DATA INFILE. , CHÈN VÀO. LỰA CHỌN. , UPDATE] trả về thông tin bổ sung. Kết quả được trả về bởi mysql_info[]. Xem mô tả cho mysql_info[] để biết định dạng của chuỗi mà nó trả về. mysql_info[] trả về một con trỏ NULL nếu không có thông tin bổ sung
Làm cách nào tôi có thể nhận ID duy nhất cho hàng được chèn cuối cùng?
Nếu bạn chèn bản ghi vào bảng chứa cột có thuộc tính AUTO_INCREMENT, bạn có thể lấy ID được tạo gần đây nhất bằng cách gọi hàm mysql_insert_id[ ]
Bạn cũng có thể truy xuất ID bằng cách sử dụng hàm LAST_INSERT_ID[ ] trong chuỗi truy vấn mà bạn chuyển đến mysql_query[ ]
Bạn có thể kiểm tra xem chỉ mục AUTO_INCREMENT có được sử dụng hay không bằng cách thực thi đoạn mã sau. Điều này cũng kiểm tra xem truy vấn có phải là CHÈN với chỉ mục AUTO_INCREMENT không
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];3
ID được tạo gần đây nhất được duy trì trong máy chủ trên cơ sở mỗi kết nối. Nó sẽ không bị thay đổi bởi một khách hàng khác. Nó thậm chí sẽ không bị thay đổi nếu bạn cập nhật một cột AUTO_INCREMENT khác với giá trị không phải là ma thuật [nghĩa là giá trị không phải NULL và không phải 0]
Nếu bạn muốn sử dụng ID đã được tạo cho một bảng và chèn nó vào bảng thứ hai, bạn có thể sử dụng các câu lệnh SQL như sau
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];4
Sự cố liên kết với API C
Khi liên kết với API C, một số hệ thống có thể xảy ra các lỗi sau
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];5
Nếu điều này xảy ra trên hệ thống của bạn, bạn phải thêm thư viện toán học bằng cách thêm -lm vào cuối dòng biên dịch/liên kết
Nếu bạn biên dịch các máy khách MySQL mà bạn tự viết hoặc bạn lấy từ bên thứ ba, chúng phải được liên kết bằng tùy chọn -lmysqlclient -lz trên lệnh liên kết. Bạn cũng có thể cần chỉ định tùy chọn -L để báo cho trình liên kết biết nơi tìm thư viện. Ví dụ: nếu thư viện được cài đặt trong
#include "mysql/mysql.h"
01, hãy sử dụng -L/usr/local/mysql/lib -lmysqlclient -lz trên lệnh liên kếtĐối với các máy khách sử dụng tệp tiêu đề MySQL, bạn có thể cần chỉ định tùy chọn -I khi bạn biên dịch chúng [ví dụ: -I/usr/local/mysql/include], để trình biên dịch có thể tìm thấy tệp tiêu đề
Cách tạo một ứng dụng khách theo luồng
Thư viện máy khách gần như an toàn cho luồng. Vấn đề lớn nhất là các chương trình con trong
#include "mysql/mysql.h"
02 đọc từ ổ cắm không an toàn cho ngắt. Điều này được thực hiện với suy nghĩ rằng bạn có thể muốn có báo thức của riêng mình để có thể ngắt một lần đọc dài tới máy chủ. Nếu bạn cài đặt trình xử lý ngắt cho ngắt SIGPIPE, thì việc xử lý ổ cắm phải an toàn cho luồngTrong các tệp nhị phân cũ hơn, chúng tôi phân phối trên trang web của mình [http. //www. mysql. com/], các thư viện máy khách thường không được biên dịch với tùy chọn an toàn cho luồng [theo mặc định, các tệp nhị phân của Windows được biên dịch để an toàn cho luồng]. Các bản phân phối nhị phân mới hơn phải có cả thư viện máy khách bình thường và an toàn theo luồng
Để có một máy khách theo luồng mà bạn có thể ngắt máy khách khỏi các luồng khác và đặt thời gian chờ khi nói chuyện với máy chủ MySQL, bạn nên sử dụng các thư viện -lmysys, -lstring và -ldbug và net_serv. o mã mà máy chủ sử dụng
Nếu bạn không cần ngắt hoặc hết thời gian chờ, bạn chỉ cần biên dịch thư viện máy khách an toàn cho luồng [mysqlclient_r] và sử dụng thư viện này. Xem Phần 8. 4. Trong trường hợp này, bạn không phải lo lắng về net_serv. o tệp đối tượng hoặc các thư viện MySQL khác
Khi sử dụng ứng dụng khách theo luồng và bạn muốn sử dụng thời gian chờ và ngắt, bạn có thể sử dụng hiệu quả các quy trình trong tệp
#include "mysql/mysql.h"
03. Nếu bạn đang sử dụng các thường trình từ thư viện mysys, điều duy nhất bạn phải nhớ là gọi my_init[ ] trước. Nhìn thấyTheo mặc định, tất cả các hàm ngoại trừ mysql_real_connect[] đều an toàn cho luồng. Các ghi chú sau đây mô tả cách biên dịch thư viện máy khách an toàn theo luồng và sử dụng nó theo cách an toàn theo luồng. [Những ghi chú này cho mysql_real_connect[] thực tế cũng áp dụng cho mysql_connect[], nhưng vì mysql_connect[] không được dùng nữa nên bạn vẫn nên sử dụng mysql_real_connect[]. ]
Để làm cho luồng mysql_real_connect[] an toàn, bạn phải biên dịch lại thư viện máy khách bằng lệnh này
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];6
Thao tác này sẽ tạo thư viện ứng dụng khách an toàn theo luồng libmysqlclient_r. --enable-thread-safe-client. Thư viện này an toàn theo luồng cho mỗi kết nối. Bạn có thể để hai chủ đề chia sẻ cùng một kết nối với những cảnh báo sau
Hai luồng không thể gửi truy vấn đến máy chủ MySQL cùng một lúc trên cùng một kết nối. Cụ thể, bạn phải đảm bảo rằng giữa mysql_query[] và mysql_store_result[] không có luồng nào khác đang sử dụng cùng một kết nối
Nhiều luồng có thể truy cập các tập kết quả khác nhau được truy xuất bằng mysql_store_result[ ]
Nếu bạn sử dụng mysql_use_result, bạn phải đảm bảo rằng không có luồng nào khác đang sử dụng cùng một kết nối cho đến khi đóng tập kết quả. Tuy nhiên, tốt nhất là các máy khách theo luồng chia sẻ cùng một kết nối để sử dụng mysql_store_result[ ]
Nếu bạn muốn sử dụng nhiều luồng trên cùng một kết nối, bạn phải có khóa mutex xung quanh tổ hợp cuộc gọi mysql_query[] và mysql_store_result[] của mình. Khi mysql_store_result[] đã sẵn sàng, khóa có thể được giải phóng và các luồng khác có thể truy vấn cùng một kết nối
Nếu bạn lập trình với các luồng POSIX, bạn có thể sử dụng pthread_mutex_lock[] và pthread_mutex_unlock[] để thiết lập và giải phóng khóa mutex
Bạn cần biết những điều sau đây nếu bạn có một chuỗi đang gọi các hàm MySQL không tạo kết nối đến cơ sở dữ liệu MySQL
Khi bạn gọi mysql_init[] hoặc mysql_connect[], MySQL sẽ tạo một biến dành riêng cho luồng cho luồng được sử dụng bởi thư viện gỡ lỗi [trong số những thứ khác]
Nếu bạn gọi một hàm MySQL, trước khi luồng được gọi mysql_init[] hoặc mysql_connect[], thì luồng sẽ không có sẵn các biến cần thiết dành riêng cho luồng và bạn có khả năng sớm hay muộn sẽ kết thúc với kết xuất lõi
Để mọi thứ hoạt động trơn tru, bạn phải làm như sau
Gọi my_init[] khi bắt đầu chương trình của bạn nếu nó gọi bất kỳ chức năng MySQL nào khác trước khi gọi mysql_real_connect[]
Gọi mysql_thread_init[ ] trong trình xử lý luồng trước khi gọi bất kỳ hàm MySQL nào
Trong chuỗi, hãy gọi mysql_thread_end[ ] trước khi gọi pthread_exit[ ]. Điều này sẽ giải phóng bộ nhớ được sử dụng bởi các biến cụ thể theo luồng của MySQL
Bạn có thể gặp một số lỗi do các ký hiệu không xác định khi liên kết ứng dụng khách của mình với libmysqlclient_r. Trong hầu hết các trường hợp, điều này là do bạn chưa bao gồm các thư viện luồng trên dòng liên kết/biên dịch
libmysqld, Thư viện máy chủ MySQL nhúng
Tổng quan về thư viện máy chủ MySQL nhúng
Thư viện máy chủ MySQL được nhúng giúp có thể chạy một máy chủ MySQL đầy đủ tính năng bên trong ứng dụng khách. Những lợi ích chính là tăng tốc độ và quản lý đơn giản hơn cho các ứng dụng nhúng
API giống hệt nhau cho phiên bản MySQL được nhúng và phiên bản máy khách/máy chủ. Để thay đổi một ứng dụng luồng cũ sang sử dụng thư viện nhúng, thông thường bạn chỉ phải thêm lệnh gọi vào các chức năng sau
Chức năng
Khi nào thì gọi
mysql_server_init[ ]
Nên được gọi trước khi bất kỳ hàm MySQL nào khác được gọi, tốt nhất là gọi sớm hàm main[]
mysql_server_end[]
Nên được gọi trước khi chương trình của bạn thoát
mysql_thread_init[]
Nên được gọi trong mỗi luồng bạn tạo sẽ truy cập MySQL
mysql_thread_end[]
Nên gọi trước khi gọi pthread_exit[ ]
Sau đó, bạn phải liên kết mã của mình với libmysqld. thay vì libmysqlclient. a
Các chức năng mysql_server_xxx trước đó cũng được bao gồm trong libmysqlclient. a để cho phép bạn thay đổi giữa phiên bản được nhúng và phiên bản máy khách/máy chủ bằng cách chỉ liên kết ứng dụng của bạn với thư viện phù hợp. Nhìn thấy
Biên dịch chương trình với libmysqld
Để có thư viện libmysqld, bạn nên định cấu hình MySQL bằng tùy chọn --with-embedded-server
Khi bạn liên kết chương trình của mình với libmysqld, bạn cũng phải bao gồm các thư viện pthread dành riêng cho hệ thống và một số thư viện mà máy chủ MySQL sử dụng. Bạn có thể lấy danh sách đầy đủ các thư viện bằng cách thực thi mysql_config --libmysqld-libs
Phải sử dụng các cờ chính xác để biên dịch và liên kết chương trình luồng, ngay cả khi bạn không gọi trực tiếp bất kỳ chức năng luồng nào trong mã của mình
Hạn chế khi sử dụng máy chủ MySQL nhúng
Máy chủ nhúng có các giới hạn sau
Không hỗ trợ bảng ISAM. [Điều này chủ yếu được thực hiện để làm cho thư viện nhỏ hơn. ]
Không có chức năng UDF
Không có dấu vết ngăn xếp trên kết xuất lõi
Không hỗ trợ RAID nội bộ. [Điều này thường không cần thiết, vì hầu hết các hệ điều hành hiện nay đều hỗ trợ các tệp lớn. ]
Bạn có thể thiết lập cái này làm máy chủ hoặc máy chủ [không sao chép]
Bạn không thể kết nối với máy chủ nhúng từ một quy trình bên ngoài bằng ổ cắm hoặc TCP/IP
Một số hạn chế này có thể được thay đổi bằng cách chỉnh sửa tệp bao gồm
#include "mysql/mysql.h"
04 và biên dịch lại MySQLSử dụng tệp tùy chọn với máy chủ nhúng
Sau đây là cách được đề xuất để sử dụng các tệp tùy chọn nhằm giúp dễ dàng chuyển đổi giữa ứng dụng máy khách/máy chủ và ứng dụng mà MySQL được nhúng. Nhìn thấy
Đặt các tùy chọn phổ biến trong phần [máy chủ]. Chúng sẽ được đọc bởi cả hai phiên bản MySQL
Đặt các tùy chọn dành riêng cho máy khách/máy chủ trong phần [mysqld]
Đặt các tùy chọn dành riêng cho MySQL được nhúng trong phần [được nhúng]
Đặt các tùy chọn dành riêng cho ứng dụng trong phần [ApplicationName_SERVER]
Những việc còn lại phải làm trong máy chủ nhúng [TODO]
Hiện tại chúng tôi chỉ cung cấp phiên bản tĩnh của thư viện mysqld. Trong tương lai, chúng tôi cũng sẽ cung cấp một thư viện dùng chung cho việc này
Chúng tôi sẽ cung cấp các tùy chọn để loại bỏ một số phần của MySQL để làm cho thư viện nhỏ hơn
Vẫn còn rất nhiều việc phải tối ưu hóa tốc độ
Lỗi được ghi vào stderr. Chúng tôi sẽ thêm một tùy chọn để chỉ định tên tệp cho những
Chúng tôi phải thay đổi InnoDB để không quá dài dòng khi được sử dụng trong phiên bản nhúng
Một ví dụ máy chủ nhúng đơn giản
Chương trình mẫu và tệp thực hiện này sẽ hoạt động mà không có bất kỳ thay đổi nào trên hệ thống Linux hoặc FreeBSD. Đối với các hệ điều hành khác, sẽ cần có những thay đổi nhỏ. Ví dụ này được thiết kế để cung cấp đủ chi tiết để hiểu vấn đề, không lộn xộn, đây là một phần cần thiết của ứng dụng thực tế
Để thử ví dụ, hãy tạo một thư mục
#include "mysql/mysql.h"
05 ở cùng cấp độ với mysql-4. 0 thư mục nguồn. Lưu nguồn
#include "mysql/mysql.h"
06 và
#include "mysql/mysql.h"
07 trong thư mục và chạy GNU
#include "mysql/mysql.h"
08 từ bên trong thư mục
#include "mysql/mysql.h"
05
#include "mysql/mysql.h"
06if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];7
#include "mysql/mysql.h"
07if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];8
if [field->flags & NOT_NULL_FLAG] printf["Field can't be null\n"];9
Cấp phép máy chủ nhúng
Mã nguồn MySQL được bảo vệ bởi giấy phép GNU GPL [xem http. //www. mysql. com/doc/G/P/GPL-giấy phép. html]. Một kết quả của việc này là bất kỳ chương trình nào bao gồm, bằng cách liên kết với libmysqld, mã nguồn MySQL phải được phát hành dưới dạng phần mềm miễn phí [theo giấy phép tương thích với GPL]
Chúng tôi khuyến khích mọi người quảng bá phần mềm miễn phí bằng cách phát hành mã theo GPL hoặc giấy phép tương thích. Đối với những người không thể làm điều này, một tùy chọn khác là mua giấy phép thương mại cho mã MySQL từ MySQL AB. Để biết chi tiết, vui lòng xem