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