MySQL với C

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ượng

Tạ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_RES

Cấ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_FIELD

Cấ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_ulonglong

Loạ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ắn

Giá 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ại

Loạ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_length

Chiề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ấu

Cá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ấu

Số 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ố 8

Khi 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_ERROR

Máy chủ MySQL đã biến mất

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

ER_UNKNOWN_COM_ERROR

Máy chủ MySQL không thực hiện lệnh này (có thể là máy chủ cũ)

ER_ACCESS_DENIED_ERROR

Người dùng hoặc mật khẩu đã sai

ER_BAD_DB_ERROR

Cơ sở dữ liệu không tồn tại

ER_DBACCESS_DENIED_ERROR

Người dùng không có quyền truy cập vào cơ sở dữ liệu

ER_WRONG_DB_NAME

Tên cơ sở dữ liệu quá dài


#include "mysql/mysql.h"
0

ký 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_ERROR

Máy chủ MySQL đã biến mất

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


#include "mysql/mysql.h"
1

void 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"
3

int 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_ERROR

Máy chủ MySQL đã biến mất

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


#include "mysql/mysql.h"
4

int 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_ERROR

Máy chủ MySQL đã biến mất

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

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"
5

Tuy 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_ERROR

Máy chủ MySQL đã biến mất

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

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_MEMORY

hết bộ nhớ

CR_SERVER_GONE_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Má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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Không thể kết nối với máy chủ MySQL cục bộ

CR_IPSOCK_ERROR

Không thể tạo ổ cắm IP

CR_OUT_OF_MEMORY

hết bộ nhớ

CR_SOCKET_CREATE_ERROR

Không thể tạo ổ cắm Unix

CR_UNKNOWN_HOST

Không thể tìm thấy địa chỉ IP cho tên máy chủ

CR_VERSION_ERROR

Giao 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_ERROR

Không tạo được đường dẫn có tên trên Windows

CR_NAMEDPIPEWAIT_ERROR

Không đợi được đường dẫn có tên trên Windows

CR_NAMEDPIPESETSTATE_ERROR

Không tải được trình xử lý đường ống trên Windows

CR_SERVER_LOST

Nế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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_ERROR

Máy chủ MySQL đã biến mất

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

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_MEMORY

hết bộ nhớ

CR_SERVER_GONE_ERROR

Máy chủ MySQL đã biến mất

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

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_MEMORY

hết bộ nhớ

CR_SERVER_GONE_ERROR

Máy chủ MySQL đã biến mất

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

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ồng

Trong 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ấy

Theo 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

  1. 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()

  2. 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

  3. 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 MySQL

Sử 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"
06

if (field->flags & NOT_NULL_FLAG)
    printf("Field can't be null\n");
7


#include "mysql/mysql.h"
07

if (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

Tôi có thể sử dụng MySQL với C không?

API C cung cấp quyền truy cập cấp thấp vào giao thức máy khách/máy chủ MySQL và cho phép các chương trình C truy cập nội dung cơ sở dữ liệu . Mã API C được phân phối với MySQL và được triển khai trong thư viện libmysqlclient. Để biết thông tin pháp lý, hãy xem Thông báo pháp lý.

Làm cách nào để kết nối với MySQL trong C?

Làm cách nào để truy cập cơ sở dữ liệu MySQL từ chương trình C? .
Cài đặt MySql. .
Tạo bảng trong cơ sở dữ liệu. .
Truy cập cơ sở dữ liệu MySQL từ Chương trình C. .
Biên dịch mã máy khách MySQL

API MySQL C là gì?

API MySQL C là API dựa trên C mà các ứng dụng khách được viết bằng C có thể sử dụng để giao tiếp với Máy chủ MySQL . Các chương trình máy khách đề cập đến các tệp tiêu đề API C tại thời điểm biên dịch và liên kết tới tệp thư viện C API, libmysqlclient, tại thời điểm liên kết.