Hướng dẫn mysql prepared statement maximum parameters - tham số tối đa của câu lệnh đã chuẩn bị sẵn mysql

11

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Có giới hạn số lượng biến liên kết mà tôi có thể sử dụng trong một truy vấn trong MySQL 5 không? Tôi cho rằng có, nhưng tôi không thể tìm thấy bất kỳ thông tin nào trong hướng dẫn tham khảo hoặc bằng googling.

Điều duy nhất mà tôi có thể tìm thấy cung cấp bất kỳ thông tin nào là trong tài liệu tham khảo A API: http://dev.mysql.com/doc/refman/5.0/en/mysql-stmt-bind-result.html

Điều này dường như ngụ ý rằng bộ nhớ là giới hạn duy nhất, nhưng điều đó có vẻ hơi nghi ngờ.

Cập nhật: Có một giới hạn!: there is a limit!

runner.rb:47: data_replicator.rb:312:in `prepare': Prepared statement contains too many placeholders (Mysql::Error)
        from data_replicator.rb:312:in `set_statement_handle_for'
        from data_replicator.rb:287:in `log_query'
        from data_replicator.rb:221:in `replicate_table'
        from data_replicator.rb:93:in `replicate'
        from data_replicator.rb:20:in `run'

Điều này cho tôi một cái gì đó tốt hơn để tìm kiếm!

Đã hỏi ngày 7 tháng 2 năm 2011 lúc 14:22Feb 7, 2011 at 14:22

Hướng dẫn mysql prepared statement maximum parameters - tham số tối đa của câu lệnh đã chuẩn bị sẵn mysql

Josh Gloverjosh GloverJosh Glover

24.1K26 Huy hiệu vàng86 Huy hiệu bạc128 Huy hiệu đồng26 gold badges86 silver badges128 bronze badges

4

Số lượng giữ chỗ tối đa cho các giá trị trong một câu lệnh đã chuẩn bị là giá trị tối đa của số nguyên không dấu 16 bit, hoặc cụ thể: 65,536.

Điều này có thể được nhìn thấy trong mã MySQL tại đây: SQL/SQL_PREPARE.CC:

static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }

Đã trả lời ngày 21 tháng 6 năm 2012 lúc 5:10Jun 21, 2012 at 5:10

Trent Lloydtrent LloydTrent Lloyd

1.7921 Huy hiệu vàng14 Huy hiệu bạc13 Huy hiệu đồng1 gold badge14 silver badges13 bronze badges

3

Có giới hạn 65,535 (2^16-1) Người giữ vị trí trong Mariadb 5.5 được cho là có hành vi giống hệt nhau như MySQL 5.5.65,535 (2^16-1) place holders in MariaDB 5.5 which is supposed to have identical behaviour as MySQL 5.5.

Không chắc chắn nếu có liên quan, tôi đã kiểm tra nó trên PHP 5.5.12 bằng MySQLI / MySQLND.

Đã trả lời ngày 27 tháng 6 năm 2014 lúc 9:03Jun 27, 2014 at 9:03

MartinmartinMartin

1.21215 huy hiệu bạc18 Huy hiệu đồng15 silver badges18 bronze badges

Tài liệu Mariadb cho biết giới hạn mặc định là 16.382. Và tùy thuộc vào phiên bản, có giới hạn cứng ở 4.294.967.295 (> = Mariadb 10.3.6) hoặc 1.048.576 (

Đã trả lời ngày 30 tháng 3 năm 2020 lúc 12:49Mar 30, 2020 at 12:49

1

MySQL 8.0 cung cấp hỗ trợ cho các câu lệnh được chuẩn bị phía máy chủ. Hỗ trợ này tận dụng giao thức nhị phân máy khách/máy chủ hiệu quả. Sử dụng các câu lệnh đã chuẩn bị với các khoản giữ chỗ cho các giá trị tham số có những lợi ích sau:

  • Ít chi phí để phân tích cú pháp câu lệnh mỗi lần nó được thực thi. Thông thường, các ứng dụng cơ sở dữ liệu xử lý khối lượng lớn các câu lệnh gần như giống hệt nhau, chỉ có những thay đổi đối với các giá trị theo nghĩa đen hoặc biến trong các mệnh đề như WHERE cho các truy vấn và xóa, SET để cập nhật và VALUES để chèn.

  • Bảo vệ chống lại các cuộc tấn công tiêm SQL. Các giá trị tham số có thể chứa các ký tự trích dẫn SQL và dấu phân cách không được phân giải.

Các phần sau đây cung cấp một cái nhìn tổng quan về các đặc điểm của các câu lệnh đã chuẩn bị:

  • Báo cáo chuẩn bị trong các chương trình ứng dụng

  • Các câu lệnh được chuẩn bị trong tập lệnh SQL

  • Chuẩn bị, thực thi và giải quyết các tuyên bố chuẩn bị

  • Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

Báo cáo chuẩn bị trong các chương trình ứng dụng

Các câu lệnh được chuẩn bị trong tập lệnh SQL

Các câu lệnh được chuẩn bị trong tập lệnh SQL

Chuẩn bị, thực thi và giải quyết các tuyên bố chuẩn bị

  • Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

  • Bạn có thể sử dụng các câu lệnh được chuẩn bị phía máy chủ thông qua các giao diện lập trình máy khách, bao gồm Thư viện máy khách API MySQL C cho các chương trình C, Trình kết nối MySQL/J cho các chương trình Java và Trình kết nối/Net MYSQL cho các chương trình sử dụng .NET Technologies. Ví dụ: API C cung cấp một tập hợp các cuộc gọi chức năng tạo nên API câu lệnh đã chuẩn bị. Xem C Giao diện câu lệnh API. Các giao diện ngôn ngữ khác có thể cung cấp hỗ trợ cho các câu lệnh đã chuẩn bị sử dụng giao thức nhị phân bằng cách liên kết trong thư viện máy khách C, một ví dụ là tiện ích mở rộng mysqli, có sẵn trong PHP 5.0 trở lên.mysql client program.

  • Một giao diện SQL thay thế cho các câu lệnh đã chuẩn bị có sẵn. Giao diện này không hiệu quả như sử dụng giao thức nhị phân thông qua API câu lệnh đã chuẩn bị, nhưng không yêu cầu lập trình vì nó có sẵn trực tiếp ở cấp độ SQL:

Bạn có thể sử dụng nó khi không có giao diện lập trình nào có sẵn cho bạn.

  • Bạn có thể sử dụng nó từ bất kỳ chương trình nào có thể gửi các câu lệnh SQL đến máy chủ để được thực thi, chẳng hạn như chương trình máy khách MySQL.

  • Bạn có thể sử dụng nó ngay cả khi máy khách đang sử dụng phiên bản cũ của thư viện máy khách.

  • Cú pháp SQL cho các câu lệnh đã chuẩn bị được dự định sẽ được sử dụng cho các tình huống như sau:

  • Để kiểm tra cách các câu lệnh được chuẩn bị trong ứng dụng của bạn trước khi mã hóa nó.

Chuẩn bị, thực thi và giải quyết các tuyên bố chuẩn bị

Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

  • Bạn có thể sử dụng các câu lệnh được chuẩn bị phía máy chủ thông qua các giao diện lập trình máy khách, bao gồm Thư viện máy khách API MySQL C cho các chương trình C, Trình kết nối MySQL/J cho các chương trình Java và Trình kết nối/Net MYSQL cho các chương trình sử dụng .NET Technologies. Ví dụ: API C cung cấp một tập hợp các cuộc gọi chức năng tạo nên API câu lệnh đã chuẩn bị. Xem C Giao diện câu lệnh API. Các giao diện ngôn ngữ khác có thể cung cấp hỗ trợ cho các câu lệnh đã chuẩn bị sử dụng giao thức nhị phân bằng cách liên kết trong thư viện máy khách C, một ví dụ là tiện ích mở rộng mysqli, có sẵn trong PHP 5.0 trở lên.

  • Một giao diện SQL thay thế cho các câu lệnh đã chuẩn bị có sẵn. Giao diện này không hiệu quả như sử dụng giao thức nhị phân thông qua API câu lệnh đã chuẩn bị, nhưng không yêu cầu lập trình vì nó có sẵn trực tiếp ở cấp độ SQL:

  • Bạn có thể sử dụng nó khi không có giao diện lập trình nào có sẵn cho bạn.

Các ví dụ sau đây cho thấy hai cách tương đương để chuẩn bị một tuyên bố tính toán hypotenuse của một tam giác với độ dài của hai bên.

Ví dụ đầu tiên cho thấy cách tạo một câu lệnh đã chuẩn bị bằng cách sử dụng một chuỗi theo nghĩa đen để cung cấp văn bản của câu lệnh:

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;

Ví dụ thứ hai là tương tự, nhưng cung cấp văn bản của câu lệnh dưới dạng biến người dùng:

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;

Dưới đây là một ví dụ bổ sung thể hiện cách chọn bảng để thực hiện truy vấn trong thời gian chạy, bằng cách lưu trữ tên của bảng làm biến người dùng:

mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;

Một tuyên bố được chuẩn bị là cụ thể cho phiên mà nó được tạo ra. Nếu bạn chấm dứt một phiên mà không giải quyết một câu lệnh đã chuẩn bị trước đó, máy chủ sẽ tự động giải quyết nó.

Một tuyên bố chuẩn bị cũng là toàn cầu cho phiên. Nếu bạn tạo một tuyên bố đã chuẩn bị trong một thói quen được lưu trữ, nó sẽ không được giải quyết khi thói quen được lưu trữ kết thúc.

Để bảo vệ chống lại quá nhiều câu lệnh được chuẩn bị được tạo đồng thời, hãy đặt biến hệ thống

static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
3. Để ngăn chặn việc sử dụng các câu lệnh đã chuẩn bị, đặt giá trị thành 0.

Cú pháp SQL được phép trong các câu lệnh đã chuẩn bị

Các câu lệnh SQL sau đây có thể được sử dụng làm câu lệnh đã chuẩn bị:

ALTER TABLE
ALTER USER
ANALYZE TABLE
CACHE INDEX
CALL
CHANGE MASTER
CHECKSUM {TABLE | TABLES}
COMMIT
{CREATE | DROP} INDEX
{CREATE | RENAME | DROP} DATABASE
{CREATE | DROP} TABLE
{CREATE | RENAME | DROP} USER
{CREATE | DROP} VIEW
DELETE
DO
FLUSH {TABLE | TABLES | TABLES WITH READ LOCK | HOSTS | PRIVILEGES
  | LOGS | STATUS | MASTER | SLAVE | USER_RESOURCES}
GRANT
INSERT
INSTALL PLUGIN
KILL
LOAD INDEX INTO CACHE
OPTIMIZE TABLE
RENAME TABLE
REPAIR TABLE
REPLACE
RESET {MASTER | SLAVE}
REVOKE
SELECT
SET
SHOW BINLOG EVENTS
SHOW CREATE {PROCEDURE | FUNCTION | EVENT | TABLE | VIEW}
SHOW {MASTER | BINARY} LOGS
SHOW {MASTER | SLAVE} STATUS
SLAVE {START | STOP}
TRUNCATE TABLE
UNINSTALL PLUGIN
UPDATE

Các tuyên bố khác không được hỗ trợ.

Để tuân thủ tiêu chuẩn SQL, trong đó nêu rõ rằng các tuyên bố chẩn đoán không thể chuẩn bị, MySQL không hỗ trợ các câu sau đây như các câu lệnh được chuẩn bị:

  • static bool init_param_array(Prepared_statement *stmt)
    {
      LEX *lex= stmt->lex;
      if ((stmt->param_count= lex->param_list.elements))
      {
        if (stmt->param_count > (uint) UINT_MAX16)
        {
          /* Error code to be defined in 5.0 */
          my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
          return TRUE;
        }
    
    4,
    static bool init_param_array(Prepared_statement *stmt)
    {
      LEX *lex= stmt->lex;
      if ((stmt->param_count= lex->param_list.elements))
      {
        if (stmt->param_count > (uint) UINT_MAX16)
        {
          /* Error code to be defined in 5.0 */
          my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
          return TRUE;
        }
    
    5

  • static bool init_param_array(Prepared_statement *stmt)
    {
      LEX *lex= stmt->lex;
      if ((stmt->param_count= lex->param_list.elements))
      {
        if (stmt->param_count > (uint) UINT_MAX16)
        {
          /* Error code to be defined in 5.0 */
          my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
          return TRUE;
        }
    
    6,
    static bool init_param_array(Prepared_statement *stmt)
    {
      LEX *lex= stmt->lex;
      if ((stmt->param_count= lex->param_list.elements))
      {
        if (stmt->param_count > (uint) UINT_MAX16)
        {
          /* Error code to be defined in 5.0 */
          my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
          return TRUE;
        }
    
    7

  • Các câu lệnh chứa bất kỳ tham chiếu nào đến biến hệ thống

    static bool init_param_array(Prepared_statement *stmt)
    {
      LEX *lex= stmt->lex;
      if ((stmt->param_count= lex->param_list.elements))
      {
        if (stmt->param_count > (uint) UINT_MAX16)
        {
          /* Error code to be defined in 5.0 */
          my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
          return TRUE;
        }
    
    8 hoặc
    static bool init_param_array(Prepared_statement *stmt)
    {
      LEX *lex= stmt->lex;
      if ((stmt->param_count= lex->param_list.elements))
      {
        if (stmt->param_count > (uint) UINT_MAX16)
        {
          /* Error code to be defined in 5.0 */
          my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
          return TRUE;
        }
    
    9.

Nói chung, các tuyên bố không được phép trong các tuyên bố chuẩn bị SQL cũng không được phép trong các chương trình lưu trữ. Các trường hợp ngoại lệ được ghi nhận trong Phần & NBSP; 25.8, Hạn chế trên các chương trình được lưu trữ.

Các thay đổi siêu dữ liệu đối với các bảng hoặc chế độ xem được đề cập bởi các câu lệnh đã chuẩn bị được phát hiện và gây ra sự phục hồi tự động của câu lệnh khi nó được thực hiện tiếp theo. Để biết thêm thông tin, hãy xem Phần & NBSP; 8.10.3, Bộ nhớ đệm của các câu lệnh đã chuẩn bị và các chương trình được lưu trữ.

Người giữ chỗ có thể được sử dụng cho các đối số của mệnh đề

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
0 khi sử dụng các câu lệnh đã chuẩn bị. Xem Phần & NBSP; 13.2.10, Câu lệnh Chọn.

Trong các câu lệnh

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
1 được sử dụng với
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
0 và
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
1, hỗ trợ giữ chỗ cho các tham số
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
4 và
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
5 có sẵn bắt đầu với MySQL 8.0. Xem Phần & NBSP; 13.2.1, Tuyên bố Call Call, cho một ví dụ và cách giải quyết cho các phiên bản trước. Người giữ chỗ có thể được sử dụng cho các tham số
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
6 bất kể phiên bản.

Cú pháp SQL cho các câu lệnh đã chuẩn bị không thể được sử dụng trong thời trang lồng nhau. Đó là, một tuyên bố được truyền cho

static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
0 không thể là một câu lệnh ____10,
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
1 hoặc
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
2.

Cú pháp SQL cho các câu lệnh đã chuẩn bị khác với việc sử dụng các cuộc gọi API câu lệnh đã chuẩn bị. Ví dụ: bạn không thể sử dụng chức năng API

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
1 C để chuẩn bị câu lệnh
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
0,
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
1 hoặc
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
2.

Cú pháp SQL cho các câu lệnh đã chuẩn bị có thể được sử dụng trong các quy trình được lưu trữ, nhưng không phải trong các chức năng hoặc kích hoạt được lưu trữ. Tuy nhiên, một con trỏ không thể được sử dụng cho một câu lệnh động được chuẩn bị và thực thi bằng

static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
0 và
static bool init_param_array(Prepared_statement *stmt)
{
  LEX *lex= stmt->lex;
  if ((stmt->param_count= lex->param_list.elements))
  {
    if (stmt->param_count > (uint) UINT_MAX16)
    {
      /* Error code to be defined in 5.0 */
      my_message(ER_PS_MANY_PARAM, ER(ER_PS_MANY_PARAM), MYF(0));
      return TRUE;
    }
1. Tuyên bố cho một con trỏ được kiểm tra tại thời gian tạo con trỏ, vì vậy câu lệnh không thể năng động.

Cú pháp SQL cho các câu lệnh đã chuẩn bị không hỗ trợ nhiều câu chuyện (nghĩa là nhiều câu lệnh trong một chuỗi được phân tách bởi

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
7 ký tự).

Để viết các chương trình C sử dụng câu lệnh SQL

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
1 để thực hiện các quy trình được lưu trữ có chứa các câu lệnh đã chuẩn bị, cờ
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
9 phải được bật. Điều này là do mỗi
mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;
1 trả về kết quả để chỉ ra trạng thái cuộc gọi, ngoài bất kỳ bộ kết quả nào có thể được trả về bởi các câu lệnh được thực thi trong quy trình.

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
9 có thể được bật khi bạn gọi
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;
2, rõ ràng bằng cách vượt qua cờ
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
9 hoặc hoàn toàn bằng cách vượt qua
mysql> USE test;
mysql> CREATE TABLE t1 (a INT NOT NULL);
mysql> INSERT INTO t1 VALUES (4), (8), (11), (32), (80);

mysql> SET @table = 't1';
mysql> SET @s = CONCAT('SELECT * FROM ', @table);

mysql> PREPARE stmt3 FROM @s;
mysql> EXECUTE stmt3;
+----+
| a  |
+----+
|  4 |
|  8 |
| 11 |
| 32 |
| 80 |
+----+

mysql> DEALLOCATE PREPARE stmt3;
4 (cũng cho phép
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;
9). Để biết thêm thông tin, xem Phần & NBSP; 13.2.1, Tuyên bố cuộc gọi.

MySQL chấp nhận bao nhiêu tham số?

MySQL hỗ trợ hai loại tham số: được đặt tên và không tên.two kinds of parameters: named and unnamed.

Có giới hạn nào trong mệnh đề trong MySQL không?

Trong MySQL, bạn sẽ có thể đặt càng nhiều giá trị trong mệnh đề trong tùy thích, chỉ bị hạn chế bởi giá trị của "max_allowed_packet".you should be able to put as many values in the IN clause as you want, only constrained by the value of "max_allowed_packet".

Hàm SQL Max cần bao nhiêu tham số?

Microsoft SQL Server có giới hạn về số lượng tham số mà truy vấn được tham số hóa có thể có (2100).2100).

Sự khác biệt giữa các câu lệnh được chuẩn bị và truy vấn tham số hóa là gì?

Các câu lệnh được chuẩn bị đã được giải thích, các tham số thay đổi DBMS và truy vấn bắt đầu ngay lập tức.Đây là một tính năng của một số DBM nhất định và bạn có thể đạt được phản hồi nhanh (có thể so sánh với các quy trình được lưu trữ).Câu lệnh tham số chỉ là một cách bạn sáng tác chuỗi truy vấn trong các ngôn ngữ lập trình của bạn.. This is a feature of certain DBMS and you can achieve fast response (comparable with stored procedures). Parametrized statement are just a way you compose the query string in your programming languages.