API máy khách MySQL

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ủ. 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. Thí 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

ký tự * bảng

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");
unsigned int độ dài

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. Thấy

Hàm số

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ở

mysql_character_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 một 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 hợ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 đều đã được tải về máy khách, nên bạn không chỉ có thể truy cập các hàng theo trình 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 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 chỉ đị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

if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...

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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}

mysql_character_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

if(mysql_create_db(&mysql, "my_database"))
{
   fprintf(stderr, "Failed to create new database.  Error: %s\n",
           mysql_error(&mysql));
}

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

________số 8_______

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

if(mysql_drop_db(&mysql, "my_database"))
  fprintf(stderr, "Failed to drop the database: Error: %s\n",
          mysql_error(&mysql));

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

mysql_query(&mysql,"SELECT * FROM some_table");
result = mysql_use_result(&mysql);
while((row = mysql_fetch_row(result)))
{
    // do something with data
}
if(!mysql_eof(result))  // mysql_fetch_row( ) failed due to an error
{
    fprintf(stderr, "Error: %s\n", mysql_error(&mysql));
}

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. 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à CHỌN 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ả)

Returns the position of the field cursor used for the last mysql_fetch_field( ). This value can be used as an argument to mysql_field_seek( )

The current offset of the field cursor

void mysql_free_result(MYSQL_RES *result)

Frees the memory allocated for a result set by mysql_store_result( ), mysql_use_result( ), mysql_list_dbs( ), etc. When you are done with a result set, you must free the memory it uses by calling mysql_free_result( )

char *mysql_get_client_info(void)

Returns a string that represents the client library version

A character string that represents the MySQL client library version

char *mysql_get_host_info(MYSQL *mysql)

Returns a string describing the type of connection in use, including the server hostname

A character string representing the server hostname and the connection type

unsigned int mysql_get_proto_info(MYSQL *mysql)

Returns the protocol version used by the current connection

An unsigned integer representing the protocol version used by the current connection

char *mysql_get_server_info(MYSQL *mysql)

Returns a string that represents the server version number

A character string that represents the server version number

char *mysql_info(MYSQL *mysql)

Retrieves a string providing information about the most recently executed query, but only for the following statements. For other statements, mysql_info( ) returns NULL. The format of the string varies depending on the type of query. The numbers are illustrative only; the string will contain values appropriate for the query

INSERT INTO . SELECT

String format. Records. 100 Duplicates. 0 Warnings. 0

INSERT INTO . VALUES (. ),(. ),(. )

String format. Records. 3 Duplicates. 0 Warnings. 0

LOAD DATA INFILE

String format. Records. 1 Deleted. 0 Skipped. 0 Warnings. 0

ALTER TABLE

String format. Records. 3 Duplicates. 0 Warnings. 0

UPDATE

String format. Rows matched. 40 Changed. 40 Warnings. 0

Note that mysql_info( ) returns a non-NULL value for the INSERT . VALUES statement only if multiple value lists are specified in the statement

A character string representing additional information about the most recently executed query. NULL if no information is available for the query

MYSQL *mysql_init(MYSQL *mysql)

Allocates or initialises a MySQL object suitable for mysql_real_connect( ). If mysql is a NULL pointer, the function allocates, initialises, and returns a new object. Otherwise, the object is initialised and the address of the object is returned. If mysql_init( ) allocates a new object, it will be freed when mysql_close( ) is called to close the connection

An initialised MYSQL* handle. NULL if there was insufficient memory to allocate a new object

In case of insufficient memory, NULL is returned

my_ulonglong mysql_insert_id(MYSQL *mysql)

Returns the ID generated for an AUTO_INCREMENT column by the previous query. Use this function after you have performed an INSERT query into a table that contains an AUTO_INCREMENT field

Note that mysql_insert_id( ) returns 0 if the previous query does not generate an AUTO_INCREMENT value. If you need to save the value for later, be sure to call mysql_insert_id( ) immediately after the query that generates the value

mysql_insert_id( ) is updated after INSERT and UPDATE statements that generate an AUTO_INCREMENT value or that set a column value to LAST_INSERT_ID(expr). See

Also note that the value of the SQL LAST_INSERT_ID( ) function always contains the most recently generated AUTO_INCREMENT value, and is not reset between queries because the value of that function is maintained in the server

The value of the AUTO_INCREMENT field that was updated by the previous query. Returns zero if there was no previous query on the connection or if the query did not update an AUTO_INCREMENT value

int mysql_kill(MYSQL *mysql, unsigned long pid)

Asks the server to kill the thread specified by 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)

Returns a result set consisting of database names on the server that match the simple regular expression specified by the wild parameter. wild may contain the wildcard characters

if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...
4 or
if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...
5, or may be a NULL pointer to match all databases. Calling mysql_list_dbs( ) is similar to executing the query SHOW databases [LIKE wild]

You must free the result set with mysql_free_result( )

A MYSQL_RES result set for success. NULL if an error occurred

CR_COMMANDS_OUT_OF_SYNC

Các lệnh được thực hiện không đúng thứ tự

CR_OUT_OF_MEMORY

Out of memory

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)

Returns a result set consisting of field names in the given table that match the simple regular expression specified by the wild parameter. wild may contain the wildcard characters

if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...
4 or
if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...
5, or may be a NULL pointer to match all fields. Calling mysql_list_fields( ) is similar to executing the query SHOW COLUMNS FROM tbl_name [LIKE wild]

Note that it’s recommended that you use SHOW COLUMNS FROM tbl_name instead of mysql_list_fields( )

You must free the result set with mysql_free_result( )

A MYSQL_RES result set for success. NULL if an error occurred

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)

Returns a result set describing the current server threads. This is the same kind of information as that reported by mysqladmin processlist or a SHOW PROCESSLIST query

You must free the result set with mysql_free_result( )

A MYSQL_RES result set for success. NULL if an error occurred

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)

Returns a result set consisting of table names in the current database that match the simple regular expression specified by the wild parameter. wild may contain the wildcard characters

if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...
4 or
if (result)                   /* correct */
    .. error ...

if (result < 0)               /* incorrect */
    .. error ...

if (result == -1)             /* incorrect */
    .. error ...
5, or may be a NULL pointer to match all tables. Calling mysql_list_tables( ) is similar to executing the query SHOW tables [LIKE wild]

You must free the result set with mysql_free_result( )

A MYSQL_RES result set for success. NULL if an error occurred

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 *result)

or

unsigned int mysql_num_fields(MYSQL *mysql)

The second form doesn’t work on MySQL Version 3. 22. 24 hoặc mới hơn. To pass a MYSQL* argument, you must use unsigned int mysql_field_count(MYSQL *mysql) instead

Trả về số cột trong một tập hợp kết quả

Note that you can get the number of columns either from a pointer to a result set or to a connection handle. You would use the connection handle if mysql_store_result( ) or mysql_use_result( ) returned NULL (and thus you have no result set pointer). In this case, you can call mysql_field_count( ) to determine whether mysql_store_result( ) should have produced a non-empty result. This allows the client program to take proper action without knowing whether or not the query was a SELECT (or SELECT-like) statement. The following example illustrates how this may be done

.

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

An alternative (if you know that your query should have returned a result set) is to replace the mysql_errno(&mysql) call with a check if mysql_field_count(&mysql) is = 0. This will only happen if something went wrong

my_ulonglong mysql_num_rows(MYSQL_RES *result)

Returns the number of rows in the result set

The use of mysql_num_rows( ) depends on whether you use mysql_store_result( ) or mysql_use_result( ) to return the result set. If you use mysql_store_result( ), mysql_num_rows( ) may be called immediately. Nếu bạn sử dụng mysql_use_result(), mysql_num_rows() sẽ không trả về giá trị chính xác cho đến khi tất cả các hàng trong tập hợp kết quả đã được truy xuất

The number of rows in the result set

int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg)

Can be used to set extra connect options and affect behavior for a connection. This function may be called multiple times to set several options

mysql_options( ) should be called after mysql_init( ) and before mysql_connect( ) or mysql_real_connect( )

The option argument is the option that you want to set; the arg argument is the value for the option. If the option is an integer, arg should point to the value of the integer

Possible option values

Option

loại đối số

Hàm số

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

Not used

Use the compressed client/server protocol

MYSQL_OPT_LOCAL_INFILE

Optional pointer to uint

If no pointer is given or if pointer points to a nonzero unsigned int . = 0, the command LOAD LOCAL INFILE is enabled

MYSQL_OPT_NAMED_PIPE

Not used

Use named pipes to connect to a MySQL server on NT

MYSQL_INIT_COMMAND

char *

Command to execute when connecting to the MySQL server. Will automatically be re-executed when reconnecting

MYSQL_READ_DEFAULT_FILE

char *

Read options from the named option file instead of from

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

char *

Read options from the named group from

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
0 or the file specified with MYSQL_READ_DEFAULT_FILE

Note that the group client is always read if you use MYSQL_READ_DEFAULT_FILE or MYSQL_READ_DEFAULT_GROUP

The specified group in the option file may contain the following options

Option

Sự miêu tả

connect-timeout

Connect timeout in seconds. On Linux this timeout is also used for waiting for the first answer from the server

compress

Use the compressed client/server protocol

database

Connect to this database if no database was specified in the connect command

debug

Debug options

disable-local-infile

Disable use of LOAD DATA LOCAL

host

Default hostname

init-command

Command to execute when connecting to MySQL server. Will automatically be re-executed when reconnecting

interactive-timeout

Same as specifying CLIENT_INTERACTIVE to mysql_real_connect( ). See

local-infile[=(0. 1)]

If no argument or argument . = 0, then enable use of LOAD DATA LOCAL

password

Default password

pipe

Use named pipes to connect to a MySQL server on NT

port

Default port number

trả lại tìm thấy hàng

Tell mysql_info( ) to return found rows instead of updated rows when using UPDATE

socket

Default socket number

user

Default user

Note that timeout has been replaced by connect-timeout, but timeout will still work for a while

For more information about option files, see

Zero for success. Non-zero if you used an unknown option

if (IS_NUM(field->type))
    printf("Field is numeric\n");
9

This requests that the client use the compressed client/server protocol and read the additional options from the odbc section in the

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
0 file

int mysql_ping(MYSQL *mysql)

Checks whether the connection to the server is working. If it has gone down, an automatic reconnection is attempted

This function can be used by clients that remain idle for a long while, to check whether the server has closed the connection and to reconnect if necessary

Zero if the server is alive. Non-zero if an error occurred

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 *query)

Executes the SQL query pointed to by the null-terminated string query. The query must consist of a single SQL statement. You should not add a terminating semicolon (

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
3) or \g to the statement

mysql_query( ) cannot be used for queries that contain binary data; you should use mysql_real_query( ) instead. (Binary data may contain the

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
4 character, which mysql_query( ) interprets as the end of the query string. )

If you want to know if the query should return a result set, you can use mysql_field_count( ) to check for this. See

Zero if the query was successful. Non-zero if an error occurred

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, unsigned int port, const char *unix_socket, unsigned int client_flag)

mysql_real_connect( ) attempts to establish a connection to a MySQL database engine running on host. mysql_real_connect( ) must complete successfully before you can execute any of the other API functions, with the exception of mysql_get_client_info( )

The parameters are specified as follows

  • The first parameter should be the address of an existing MYSQL structure. Before calling mysql_real_connect( ) you must call mysql_init( ) to initialise the MYSQL structure. You can change a lot of connect options with the mysql_options( ) call. See

  • The value of host may be either a hostname or an IP address. If host is NULL or the string "localhost", a connection to the local host is assumed. If the OS supports sockets (Unix) or named pipes (Windows), they are used instead of TCP/IP to connect to the server

  • The user parameter contains the user’s MySQL login ID. If user is NULL, the current user is assumed. Under Unix, this is the current login name. Under Windows ODBC, the current username must be specified explicitly. See

  • The passwd parameter contains the password for user. If passwd is NULL, only entries in the user table for the user that have a blank (empty) password field will be checked for a match. This allows the database administrator to set up the MySQL privilege system in such a way that users get different privileges depending on whether they have specified a password

    Note. do not attempt to encrypt the password before calling mysql_real_connect( ); password encryption is handled automatically by the client API

  • db is the database name. If db is not NULL, the connection will set the default database to this value

  • If port is not 0, the value will be used as the port number for the TCP/IP connection. Note that the host parameter determines the type of the connection

  • If unix_socket is not NULL, the string specifies the socket or named pipe that should be used. Note that the host parameter determines the type of the connection

  • The value of client_flag is usually 0, but can be set to a combination of the following flags in very special circumstances

    Flag name

    Mô tả cờ

    CLIENT_COMPRESS

    Use compression protocol

    CLIENT_FOUND_ROWS

    Return the number of found (matched) rows, not the number of affected rows

    CLIENT_IGNORE_SPACE

    Allow spaces after function names. Makes all function names reserved words

    CLIENT_INTERACTIVE

    Allow interactive_timeout seconds (instead of wait_timeout seconds) of inactivity before closing the connection

    CLIENT_NO_SCHEMA

    Don’t allow the db_name. tbl_name. col_name syntax. This is for ODBC. It causes the parser to generate an error if you use that syntax, which is useful for trapping bugs in some ODBC programs

    CLIENT_ODBC

    The client is an ODBC client. Điều này thay đổi mysqld để thân thiện với ODBC hơn

    CLIENT_SSL

    Use SSL (encrypted protocol)

A MYSQL* connection handle if the connection was successful, NULL if the connection was unsuccessful. For a successful connection, the return value is the same as the value of the first parameter

CR_CONN_HOST_ERROR

Failed to connect to the MySQL server

CR_CONNECTION_ERROR

Failed to connect to the local MySQL server

CR_IPSOCK_ERROR

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

CR_OUT_OF_MEMORY

Out of memory

CR_SOCKET_CREATE_ERROR

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

CR_UNKNOWN_HOST

Failed to find the IP address for the hostname

CR_VERSION_ERROR

A protocol mismatch resulted from attempting to connect to a server with a client library that uses a different protocol version. This can happen if you use a very old client library to connect to a new server that wasn’t started with the --old-protocol option

CR_NAMEDPIPEOPEN_ERROR

Failed to create a named pipe on Windows

CR_NAMEDPIPEWAIT_ERROR

Failed to wait for a named pipe on Windows

CR_NAMEDPIPESETSTATE_ERROR

Failed to get a pipe handler on Windows

CR_SERVER_LOST

If connect_timeout > 0 and it took longer than connect_timeout seconds to connect to the server or if the server died while executing the init-command

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

By using mysql_options( ) the MySQL library will read the [client] and your_prog_name sections in the

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
0 file, which will ensure that your program will work, even if someone has set up MySQL in some non-standard way

Note that upon connection, mysql_real_connect( ) sets the reconnect flag (part of the MYSQL structure) to a value of 1. This flag indicates, in the event that a query cannot be performed because of a lost connection, that you should try reconnecting to the server before giving up

mysql_real_escape_string()

unsigned long mysql_real_escape_string(MYSQL *mysql, char *to, const char *from, unsigned long length)

This function is used to create a legal SQL string that you can use in an SQL statement. See

The string in from is encoded to an escaped SQL string, taking into account the current character set of the connection. The result is placed in to and a terminating null byte is appended. Characters encoded are 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, ', “, and Control-Z (see )

The string pointed to by from must be length bytes long. You must allocate the to buffer to be at least length*2+1 bytes long. (In the worse case, each character may need to be encoded as using two bytes, and you need room for the terminating null byte. ) When mysql_escape_string( ) returns, the contents of to will be a null-terminated string. The return value is the length of the encoded string, not including the terminating null character

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

The strmov( ) function used in the example is included in the mysqlclient library and works like strcpy( ) but returns a pointer to the terminating null of the first parameter

The length of the value placed into to, not including the terminating null character

int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)

Executes the SQL query pointed to by query, which should be a string length bytes long. The query must consist of a single SQL statement. You should not add a terminating semicolon (

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
3) or \g to the statement

You must use mysql_real_query( ) rather than mysql_query( ) for queries that contain binary data because binary data may contain the

mysql_query(&mysql,"UPDATE products SET cost=cost*1.25 WHERE group=10");
printf("%ld products updated",(long) mysql_affected_rows(&mysql));
4 character. In addition, mysql_real_query( ) is faster than mysql_query( ) because it does not call strlen( ) on the query string

If you want to know whether the query should return a result set, you can use mysql_field_count( ) to check for this. See

Zero if the query was successful. Non-zero if an error occurred

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)

Asks the MySQL server to reload the grant tables. The connected user must have the reload privilege

This function is deprecated. It is preferable to use mysql_query( ) to issue a SQL FLUSH PRIVILEGES statement instead

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(MYSQL_RES *result, MYSQL_ROW_OFFSET offset)

Sets the row cursor to an arbitrary row in a query result set. Đ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( )

The offset should be a value returned from a call to mysql_row_tell( ) or to mysql_row_seek( ). This value is not simply a row number; if you want to seek to a row within a result set using a row number, use mysql_data_seek( ) instead

The previous value of the row cursor. This value may be passed to a subsequent call to mysql_row_seek( )

MYSQL_ROW_OFFSET mysql_row_tell(MYSQL_RES *result)

Returns the current position of the row cursor for the last mysql_fetch_row( ). This value can be used as an argument to mysql_row_seek( )

You should use mysql_row_tell( ) only after mysql_store_result( ), not after mysql_use_result( )

The current offset of the row cursor

int mysql_select_db(MYSQL *mysql, const char *db)

Causes the database specified by db to become the default (current) database on the connection specified by mysql. In subsequent queries, this database is the default for table references that do not include an explicit database specifier

mysql_select_db( ) fails unless the connected user can be authenticated as having permission to use the database

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)

Asks the database server to shut down. The connected user must have shutdown 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

char *mysql_stat(MYSQL *mysql)

Returns a character string containing information similar to that provided by the mysqladmin status command. This includes uptime in seconds and the number of running threads, questions, reloads, and open tables

A character string describing the server status. NULL if an error occurred

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)

You must call mysql_store_result( ) or mysql_use_result( ) for every query that successfully retrieves data (SELECT, SHOW, DESCRIBE, EXPLAIN)

You don’t have to call mysql_store_result( ) or mysql_use_result( ) for other queries, but it will not do any harm or cause any notable performance if you call mysql_store_result( ) in all cases. You can detect if the query didn’t have a result set by checking if mysql_store_result( ) returns 0 (more about this later)

If you want to know whether the query should return a result set, you can use mysql_field_count( ) to check for this. See

mysql_store_result( ) reads the entire result of a query to the client, allocates a MYSQL_RES structure, and places the result into this structure

mysql_store_result( ) returns a null pointer if the query didn’t return a result set (if the query was, for example, an INSERT statement)

mysql_store_result( ) also returns a null pointer if reading of the result set failed. You can check if you got an error by checking if mysql_error( ) doesn’t return a null pointer, if mysql_errno( ) returns <> 0, or if mysql_field_count( ) returns <> 0

An empty result set is returned if there are no rows returned. (An empty result set differs from a null pointer as a return value. )

Once you have called mysql_store_result( ) and got a result back that isn’t a null pointer, you may call mysql_num_rows( ) to find out how many rows are in the result set

You can call mysql_fetch_row( ) to fetch rows from the result set, or mysql_row_seek( ) and mysql_row_tell( ) to obtain or set the current row position within the result set

You must call mysql_free_result( ) once you are done with the result set

.

A MYSQL_RES result structure with the results. NULL if an error occurred

CR_COMMANDS_OUT_OF_SYNC

Các lệnh được thực hiện không đúng thứ tự

CR_OUT_OF_MEMORY

Out of memory

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 long mysql_thread_id(MYSQL *mysql)

Returns the thread ID of the current connection. This value can be used as an argument to mysql_kill( ) to kill the thread

If the connection is lost and you reconnect with mysql_ping( ), the thread ID will change. This means you should not get the thread ID and store it for later. You should get it when you need it

The thread ID of the current connection

MYSQL_RES *mysql_use_result(MYSQL *mysql)

You must call mysql_store_result( ) or mysql_use_result( ) for every query that successfully retrieves data (SELECT, SHOW, DESCRIBE, EXPLAIN)

mysql_use_result( ) initiates a result set retrieval but does not actually read the result set into the client like mysql_store_result( ) does. Instead, each row must be retrieved individually by making calls to mysql_fetch_row( ). This reads the result of a query directly from the server without storing it in a temporary table or local buffer, which is somewhat faster and uses much less memory than mysql_store_result( ). The client will only allocate memory for the current row and a communication buffer that may grow up to max_allowed_packet bytes

On the other hand, you shouldn’t use mysql_use_result( ) if you are doing a lot of processing for each row on the client side, or if the output is sent to a screen on which the user may type a ^S (stop scroll). This will tie up the server and prevent other threads from updating any tables from which the data is being fetched

When using mysql_use_result( ), you must execute mysql_fetch_row( ) until a NULL value is returned, otherwise, the unfetched rows will be returned as part of the result set for your next query. The C API will give the error Commands out of sync; you can't run this command now if you forget to do this

You may not use mysql_data_seek( ), mysql_row_seek( ), mysql_row_tell( ), mysql_num_rows( ), or mysql_affected_rows( ) with a result returned from mysql_use_result( ), nor may you issue other queries until the mysql_use_result( ) has finished. (However, after you have fetched all the rows, mysql_num_rows( ) will accurately return the number of rows fetched. )

You must call mysql_free_result( ) once you are done with the result set

A MYSQL_RES result structure. NULL if an error occurred

CR_COMMANDS_OUT_OF_SYNC

Các lệnh được thực hiện không đúng thứ tự

CR_OUT_OF_MEMORY

Out of memory

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 Threaded Function Descriptions

You need to use the following functions when you want to create a threaded client. See

This function needs to be called once in the program before calling any MySQL function. Điều này khởi tạo một số biến toàn cục mà MySQL cần. If you are using a thread-safe client library, this will also call mysql_thread_init( ) for this thread

This is automatically called by mysql_init( ), mysql_server_init( ), and mysql_connect( )

my_bool mysql_thread_init(void)

This function needs to be called for each created thread to initialise thread-specific variables

This is automatically called by my_init( ) and mysql_connect( )

void mysql_thread_end(void)

This function needs to be called before calling pthread_exit( ) to free memory allocated by mysql_thread_init( )

Note that this function is not invoked automatically by the client library. It must be called explicitly to avoid a memory leak

unsigned int mysql_thread_safe(void)

This function indicates whether the client is compiled as thread-safe

1 is the client is thread-safe, 0 otherwise

C Embedded Server Function Descriptions

You must use the following functions if you want to allow your application to be linked against the embedded MySQL server library. See

If the program is linked with -lmysqlclient instead of -lmysqld, these functions do nothing. This makes it possible to choose between using the embedded MySQL server and a stand-alone server without modifying any code

int mysql_server_init(int argc, char **argv, char **groups)

This function must be called once in the program before calling any other MySQL function. 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. ) that the server uses. If this function is not called, the program will crash. If you are using the DBUG package that comes with MySQL, you should call this after you have called 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. 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 một kết quả khác rỗ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. 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

When linking with the C API, the following errors may occur on some systems

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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
1, 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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
2 đọ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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
3. 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. 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( ), 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. The main benefits are increased speed and simpler management for embedded applications

The API is identical for the embedded MySQL version and the client/server version. To change an old threaded application to use the embedded library, you normally only have to add calls to the following functions

Hàm số

When to call

mysql_server_init( )

Should be called before any other MySQL function is called, preferably early in the main( ) function

mysql_server_end( )

Should be called before your program exits

mysql_thread_init( )

Should be called in each thread you create that will access MySQL

mysql_thread_end( )

Should be called before calling pthread_exit( )

Then you must link your code with 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. 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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
4 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. 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 tối ưu hóa tốc độ để làm

  • 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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
5 ở cùng cấp độ với mysql-4. 0 thư mục nguồn. Lưu nguồn
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
6 và
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
7 trong thư mục và chạy GNU
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
8 từ bên trong thư mục
if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
5

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
6

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

if (mysql_change_user(&mysql, "user", "password", "new_database"))
{
   fprintf(stderr, "Failed to change user.  Error: %s\n",
           mysql_error(&mysql));
}
7

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

MySQL có API không?

Trình kết nối MySQL và API là trình điều khiển và thư viện mà bạn sử dụng để kết nối ứng dụng bằng các ngôn ngữ lập trình khác nhau với máy chủ cơ sở dữ liệu MySQL . Máy chủ ứng dụng và cơ sở dữ liệu có thể nằm trên cùng một máy hoặc giao tiếp qua mạng.

Làm cách nào để sử dụng API trong MySQL?

Tích hợp dữ liệu. Tải dữ liệu từ API REST sang MySQL bằng cách cung cấp thông tin đăng nhập cơ sở dữ liệu MySQL của bạn, chẳng hạn như tên người dùng, mật khẩu được ủy quyền, thông tin về IP máy chủ của bạn và giá trị số cổng. You will also need to provide a name for your database and a unique name for this destination.

Làm cách nào để kết nối API Web với cơ sở dữ liệu MySQL?

API Web Với ASP. NET 6 và MySQL .
tài nguyên cần thiết
ASP. Dự án API Web NET 6
Truy cập cơ sở dữ liệu với Entity Framework
Ghi chú. Để tìm trung tâm quản trị của các gói NuGet, chúng ta có thể vào tùy chọn. Menu -> Dự án -> Quản lý gói NuGet
Chỉ huy
Bộ điều khiển cho API Web
A. Lấy danh sách tất cả người dùng đã đăng ký

Việc sử dụng Mysqlclient là gì?

Ứng dụng MySQL là tên chung cho các công cụ được thiết kế để kết nối với Máy chủ MySQL . Các chương trình client dùng để gửi lệnh hoặc truy vấn đến server và cho phép quản lý dữ liệu trong cơ sở dữ liệu được lưu trữ trên server.