Hướng dẫn mysql disable strict mode - mysql tắt chế độ nghiêm ngặt

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
26MySQL Strict Mode. The latest versions of PHPKB Knowledge Base Management Software does not require MySQL Strict Mode to be turned OFF. It was a requirement for older versions (version 8 or older) of PHPKB software.

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"25

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
95 SQL_MODE in my.cnf file (for Linux) OR my.ini file (for windows server) and restarting the MySQL server.  my.cnf file can be found in one of a few locations (depending on which distribution you're using). The most common locations are /etc/my.cnf and /etc/mysql/my.cnf .

Lưu ý: Thực hiện các thay đổi sau trong My.ini (đối với hệ điều hành Windows) hoặc My.cnf (đối với hệ điều hành Linux). . Nó có thể trông như thế này (giá trị thực của SQL_Mode có thể thay đổi): Make the following changes in the my.ini (for Windows Operating System) or my.cnf (for Linux Operating System). Inside that file, look for a heading like [mysqld] and then look for the value of sql_mode. It might look like this (the actual value of sql_mode may vary):

  1. Hãy tìm dòng sau: SQL-mode = "strict_trans_tables, no_auto_create_user, no_engine_substures"
    sql-mode = "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
  2. Bạn có thể thay đổi giá trị của SQL_MODE thành NO_Engine_SubStr Hurne sang chế độ hoàn toàn nghiêm ngặt, nhưng bạn có thể muốn tra cứu từng chế độ được định cấu hình trước khi vô hiệu hóa nó hoặc bạn có thể thay đổi nó thành: SQL-mode = "" (tức là trống) nếu SQL_Mode Không được đặt, bạn có thể thêm nó dưới tiêu đề [MySQLD], sau đó lưu tệp và khởi động lại MySQL.
    sql-mode="" (i.e. Blank)
    If sql_mode isn't set, you can add it under the [mysqld] heading, then save the file, and restart MySQL.
  3. Khởi động lại & nbsp; Dịch vụ MySQL.the MySQL Service.

HOẶC

2. Để tắt chế độ nghiêm ngặt qua SQL

Phương pháp này cho phép bạn vô hiệu hóa chế độ nghiêm ngặt trên máy chủ MySQL của mình bằng cách chạy lệnh sau.

$ mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"

Bây giờ, bạn có thể xác minh rằng chế độ được đặt bằng cách chạy như sau:

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"

Đó là tất cả! & NBSP; Tài liệu đầy đủ để thiết lập các chế độ MySQL có sẵn trên trang Chế độ SQL của máy chủ trong tài liệu MySQL. Một mô tả về tất cả các chế độ cũng có sẵn trên trang đó.

5.1.11 & NBSP; Chế độ SQL máy chủ

Máy chủ MySQL có thể hoạt động ở các chế độ SQL khác nhau và có thể áp dụng các chế độ này khác nhau cho các máy khách khác nhau, tùy thuộc vào giá trị của biến hệ thống

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2. DBA có thể đặt chế độ SQL toàn cầu để phù hợp với các yêu cầu vận hành máy chủ trang web và mỗi ứng dụng có thể đặt chế độ SQL phiên của mình thành các yêu cầu của riêng mình.

Các chế độ ảnh hưởng đến cú pháp SQL Hỗ trợ MySQL và kiểm tra xác thực dữ liệu mà nó thực hiện. Điều này giúp sử dụng MySQL dễ dàng hơn trong các môi trường khác nhau và sử dụng MySQL cùng với các máy chủ cơ sở dữ liệu khác.

  • Đặt chế độ SQL

  • Các chế độ SQL quan trọng nhất

  • Danh sách đầy đủ các chế độ SQL

  • Kết hợp các chế độ SQL

  • Chế độ SQL nghiêm ngặt

  • So sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt

Để biết câu trả lời cho các câu hỏi thường được hỏi về các chế độ SQL của máy chủ trong MySQL, xem Phần & NBSP; A.3, MYSQL 8.0 FAQ: Máy chủ SQL Chế độ.

Khi làm việc với các bảng

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
3, cũng xem xét biến hệ thống
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
4. Nó cho phép kiểm tra lỗi bổ sung cho các bảng
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
3.

Đặt chế độ SQL

Các chế độ SQL quan trọng nhất

Danh sách đầy đủ các chế độ SQL

Ghi chú

Bởi vì tiếp tục phát triển MySQL định nghĩa các lỗi mới, có thể có các lỗi không có trong danh sách trước đó mà chế độ SQL nghiêm ngặt áp dụng.

5.1.11 & NBSP; Chế độ SQL máy chủ

Máy chủ MySQL có thể hoạt động ở các chế độ SQL khác nhau và có thể áp dụng các chế độ này khác nhau cho các máy khách khác nhau, tùy thuộc vào giá trị của biến hệ thống

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2. DBA có thể đặt chế độ SQL toàn cầu để phù hợp với các yêu cầu vận hành máy chủ trang web và mỗi ứng dụng có thể đặt chế độ SQL phiên của mình thành các yêu cầu của riêng mình.

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';

Các chế độ ảnh hưởng đến cú pháp SQL Hỗ trợ MySQL và kiểm tra xác thực dữ liệu mà nó thực hiện. Điều này giúp sử dụng MySQL dễ dàng hơn trong các môi trường khác nhau và sử dụng MySQL cùng với các máy chủ cơ sở dữ liệu khác.

Để xác định cài đặt toàn cầu hoặc phiên

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2 hiện tại, hãy chọn giá trị của nó:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;

Quan trọng

Chế độ SQL và phân vùng do người dùng xác định. & NBSP; Thay đổi chế độ SQL máy chủ sau khi tạo và chèn dữ liệu vào các bảng được phân vùng có thể gây ra những thay đổi lớn trong hành vi của các bảng đó và có thể dẫn đến mất hoặc tham nhũng dữ liệu. Chúng tôi khuyên bạn không bao giờ thay đổi chế độ SQL khi bạn đã tạo các bảng sử dụng phân vùng do người dùng xác định. Changing the server SQL mode after creating and inserting data into partitioned tables can cause major changes in the behavior of such tables, and could lead to loss or corruption of data. It is strongly recommended that you never change the SQL mode once you have created tables employing user-defined partitioning.

Khi sao chép các bảng được phân vùng, các chế độ SQL khác nhau trên nguồn và bản sao cũng có thể dẫn đến các vấn đề. Để có kết quả tốt nhất, bạn phải luôn sử dụng cùng chế độ SQL máy chủ trên nguồn và bản sao.

Để biết thêm thông tin, xem Phần & NBSP; 24.6, Hạn chế và hạn chế về phân vùng.

Các chế độ SQL quan trọng nhất

Các giá trị

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2 quan trọng nhất có lẽ là sau:

  • mysql> SET sql_mode = '';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 0
    mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 1
    8

    Chế độ này thay đổi cú pháp và hành vi để phù hợp hơn với SQL tiêu chuẩn. Đây là một trong những chế độ kết hợp đặc biệt được liệt kê ở cuối phần này.

  • SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    7

    Nếu một giá trị không thể được chèn như được đưa vào bảng giao dịch, hãy hủy bỏ tuyên bố. Đối với một bảng không chuyển hóa, hãy hủy bỏ câu lệnh nếu giá trị xảy ra trong một câu lệnh hàng đơn hoặc hàng đầu tiên của câu lệnh nhiều hàng. Thông tin chi tiết được đưa ra sau trong phần này.

  • mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    0

    Làm cho MySQL hoạt động giống như một hệ thống cơ sở dữ liệu SQL truyền thống của người Viking. Một mô tả đơn giản về chế độ này là Lỗi Lỗi thay vì cảnh báo khi chèn giá trị không chính xác vào cột. Đây là một trong những chế độ kết hợp đặc biệt được liệt kê ở cuối phần này.traditional SQL database system. A simple description of this mode is give an error instead of a warning when inserting an incorrect value into a column. It is one of the special combination modes listed at the end of this section.

    Ghi chú

    Với chế độ

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    0 được bật,
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    2 hoặc
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    3 bị hủy bỏ ngay khi xảy ra lỗi. Nếu bạn đang sử dụng một công cụ lưu trữ không chuyển thể, đây có thể không phải là thứ bạn muốn vì các thay đổi dữ liệu được thực hiện trước khi lỗi có thể không được quay lại, dẫn đến bản cập nhật một phần được thực hiện trên mạng.partially done update.

Khi hướng dẫn này đề cập đến chế độ nghiêm ngặt, thì có nghĩa là một chế độ có hoặc cả

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
7 hoặc
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
5 được bật.strict mode, it means a mode with either or both
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
7 or
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
5 enabled.

Danh sách đầy đủ các chế độ SQL

Danh sách sau đây mô tả tất cả các chế độ SQL được hỗ trợ:

  • mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    6

    Không thực hiện kiểm tra đầy đủ ngày. Chỉ kiểm tra rằng tháng nằm trong khoảng từ 1 đến 12 và ngày nằm trong khoảng từ 1 đến 31. Điều này có thể hữu ích cho các ứng dụng web có được năm, tháng và ngày trong ba trường khác nhau và lưu trữ chính xác những gì người dùng chèn, mà không cần xác nhận ngày. Chế độ này áp dụng cho các cột

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    7 và
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    8. Nó không áp dụng cho các cột
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    9, luôn yêu cầu một ngày hợp lệ.

    Với

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    6 bị vô hiệu hóa, máy chủ yêu cầu giá trị tháng và ngày đó là hợp pháp và không chỉ trong khoảng 1 đến 12 và 1 đến 31, tương ứng. Với chế độ nghiêm ngặt bị vô hiệu hóa, các ngày không hợp lệ như
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    1 được chuyển đổi thành
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    2 và cảnh báo được tạo ra. Với chế độ nghiêm ngặt được bật, ngày không hợp lệ tạo ra lỗi. Để cho phép ngày như vậy, bật
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    6.

  • mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    4

    Hãy coi

    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    5 là ký tự trích dẫn định danh (như ký tự trích dẫn
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    6) và không phải là ký tự trích dẫn chuỗi. Bạn vẫn có thể sử dụng
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    6 để trích dẫn các định danh với chế độ này được bật. Với
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    4 được bật, bạn không thể sử dụng dấu ngoặc kép để trích dẫn các chuỗi theo nghĩa đen vì chúng được hiểu là định danh.

  • SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0

    Chế độ

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 ảnh hưởng đến việc xử lý phân chia theo 0, bao gồm ________ 71,0). Đối với các hoạt động thay đổi dữ liệu (
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    2,
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    3), hiệu ứng của nó cũng phụ thuộc vào liệu chế độ SQL nghiêm ngặt có được bật hay không.

    • Nếu chế độ này không được bật, phân chia bằng 0 chèn

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      4 và không tạo ra cảnh báo.

    • Nếu chế độ này được bật, phân chia bằng 0 chèn

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      4 và tạo ra cảnh báo.

    • Nếu chế độ và chế độ nghiêm ngặt này được bật, phân chia theo 0 sẽ tạo ra lỗi, trừ khi

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6 cũng được đưa ra. Đối với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      7 và
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      8, bộ phận bằng 0 chèn
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      4 và tạo ra một cảnh báo.

    Đối với

    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0, bộ phận không trả lại
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4. Cho phép
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 gây ra cảnh báo cũng được tạo ra, bất kể chế độ nghiêm ngặt có được bật hay không.

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 không được chấp nhận.
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 không phải là một phần của chế độ nghiêm ngặt, nhưng nên được sử dụng cùng với chế độ nghiêm ngặt và được bật theo mặc định. Cảnh báo xảy ra nếu
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.

    Bởi vì

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 không được chấp nhận, bạn nên hy vọng nó sẽ bị xóa trong bản phát hành MySQL trong tương lai dưới dạng tên chế độ riêng biệt và hiệu ứng của nó có trong các hiệu ứng của chế độ SQL nghiêm ngặt.

  • mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    7

    Ưu tiên của toán tử

    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    8 là các biểu thức như
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    9 được phân tích cú pháp là
    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    0. Trong một số phiên bản cũ hơn của MySQL, biểu thức được phân tích cú pháp là
    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    1. Hành vi cấp cao cao hơn có thể thu được bằng cách cho phép chế độ
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    7 SQL.

    mysql> SET sql_mode = '';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 0
    mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 1
  • mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    3

    Cho phép khoảng trống giữa tên hàm và ký tự

    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    4. Điều này gây ra tên chức năng tích hợp được coi là từ dành riêng. Do đó, các định danh giống như tên hàm phải được trích dẫn như được mô tả trong Phần & NBSP; 9.2, tên đối tượng Schema Lược đồ. Ví dụ: vì có hàm
    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    5, việc sử dụng
    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    6 làm tên bảng trong câu lệnh sau gây ra lỗi:

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax

    Tên bảng phải được trích dẫn:

    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)

    Chế độ

    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    3 SQL áp dụng cho các chức năng tích hợp, không phải cho các hàm có thể tải hoặc các chức năng được lưu trữ. Luôn luôn được phép có các khoảng trắng sau một hàm có thể tải hoặc tên chức năng được lưu trữ, bất kể
    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    3 có được bật hay không.

    Để thảo luận thêm về

    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    3, xem Phần & NBSP; 9.2.5, Phân tích tên chức năng và độ phân giải.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00 ảnh hưởng đến việc xử lý các cột
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    02. Thông thường, bạn tạo số chuỗi tiếp theo cho cột bằng cách chèn
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4 hoặc
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    04 vào nó.
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00 ngăn chặn hành vi này cho
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    04 để chỉ
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4 tạo ra số chuỗi tiếp theo.

    Chế độ này có thể hữu ích nếu

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    04 đã được lưu trữ trong cột ____102 của bảng. . một trong đó đã bị đổ. Kích hoạt
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00 Trước khi tải lại tệp Dump giải quyết vấn đề này. Vì lý do này, MySQLDump tự động bao gồm trong đầu ra của nó một câu lệnh cho phép
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00.mysqldump and then reload it, MySQL normally generates new sequence numbers when it encounters the
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    04 values, resulting in a table with contents different from the one that was dumped. Enabling
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00 before reloading the dump file solves this problem. For this reason, mysqldump automatically includes in its output a statement that enables
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    00.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    14

    Kích hoạt chế độ này vô hiệu hóa việc sử dụng ký tự dấu gạch chéo ngược (

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    15) làm ký tự thoát trong chuỗi và số nhận dạng. Với chế độ này được bật, dấu gạch chéo ngược trở thành một ký tự thông thường như bất kỳ ký tự nào khác và chuỗi thoát mặc định cho các biểu thức
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    16 được thay đổi để không sử dụng ký tự thoát.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    17

    Khi tạo một bảng, hãy bỏ qua tất cả các chỉ thị

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    18 và
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    19. Tùy chọn này rất hữu ích trên các máy chủ bản sao.

  • SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    1

    Kiểm soát thay thế tự động của công cụ lưu trữ mặc định khi một câu lệnh như

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    21 hoặc
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    22 Chỉ định một công cụ lưu trữ bị vô hiệu hóa hoặc không được biên dịch.

    Theo mặc định,

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    1 được bật.

    Bởi vì các công cụ lưu trữ có thể có thể cắm được trong thời gian chạy, các động cơ không có sẵn được xử lý theo cùng một cách:

    Với

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    1 bị vô hiệu hóa, đối với
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    25, động cơ mặc định được sử dụng và cảnh báo xảy ra nếu động cơ mong muốn không có sẵn. Đối với
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    26, một cảnh báo xảy ra và bảng không bị thay đổi.

    Với

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    1 được bật, xảy ra lỗi và bảng không được tạo hoặc thay đổi nếu không có động cơ mong muốn.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    28

    Phép trừ giữa các giá trị số nguyên, trong đó một loại thuộc loại

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    29, tạo ra kết quả không dấu theo mặc định. Nếu kết quả khác sẽ là âm, kết quả lỗi:

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'

    Nếu chế độ

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    28 SQL được bật, kết quả là âm:

    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+

    Nếu kết quả của một thao tác như vậy được sử dụng để cập nhật cột số nguyên

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    29, kết quả sẽ được cắt theo giá trị tối đa cho loại cột hoặc được cắt thành 0 nếu
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    28 được bật. Với chế độ SQL nghiêm ngặt được bật, xảy ra lỗi và cột vẫn không thay đổi.

    Khi

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    28 được bật, kết quả trừ được ký kết, ngay cả khi bất kỳ toán hạng nào không được ký. Ví dụ: so sánh loại cột
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    34 trong Bảng
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    35 với cột
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    34 trong Bảng
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    37:even if any operand is unsigned. For example, compare the type of column
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    34 in table
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    35 with that of column
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    34 in table
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    37:

    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+

    Điều này có nghĩa là

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    38 không thể sử dụng 100% trong tất cả các bối cảnh. Xem Phần & NBSP; 12.11, Chức năng Cast Cast và toán tử.

  • SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9

    Chế độ

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9 ảnh hưởng đến việc máy chủ cho phép
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    2 là một ngày hợp lệ. Hiệu ứng của nó cũng phụ thuộc vào việc chế độ SQL nghiêm ngặt được bật.

    • Nếu chế độ này không được bật,

      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 được cho phép và chèn không tạo ra cảnh báo.

    • Nếu chế độ này được bật,

      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 được cho phép và chèn tạo ra một cảnh báo.

    • Nếu chế độ và chế độ nghiêm ngặt này được bật,

      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 không được phép và chèn tạo ra lỗi, trừ khi
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6 cũng được đưa ra. Đối với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      7 và
      $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
      47,
      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 được cho phép và chèn tạo ra một cảnh báo.

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9 không được chấp nhận.
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9 không phải là một phần của chế độ nghiêm ngặt, nhưng nên được sử dụng cùng với chế độ nghiêm ngặt và được bật theo mặc định. Cảnh báo xảy ra nếu
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.

    Bởi vì

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9 không được chấp nhận, bạn nên hy vọng nó sẽ bị xóa trong bản phát hành MySQL trong tương lai dưới dạng tên chế độ riêng biệt và hiệu ứng của nó có trong các hiệu ứng của chế độ SQL nghiêm ngặt.

  • SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8

    Chế độ

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8 ảnh hưởng đến việc máy chủ cho phép ngày trong đó phần năm khác không nhưng phần tháng hoặc phần ngày là 0. (chế độ này ảnh hưởng đến ngày như
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    55 hoặc
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    56, nhưng không phải
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    2. Chế độ
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9.) Hiệu quả của
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8 cũng phụ thuộc vào việc chế độ SQL nghiêm ngặt có được bật hay không.

    • Nếu chế độ này không được bật, ngày có các bộ phận bằng 0 được cho phép và chèn không tạo ra cảnh báo.

    • Nếu chế độ này được bật, ngày không có các bộ phận được chèn là

      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 và tạo ra cảnh báo.

    • Nếu chế độ và chế độ nghiêm ngặt này được bật, ngày không được phép các phần bằng 0 và chèn tạo ra lỗi, trừ khi

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6 cũng được đưa ra. Đối với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      7 và
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      8, các ngày bằng không được chèn là
      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 và đưa ra cảnh báo.

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8 không được chấp nhận.
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8 không phải là một phần của chế độ nghiêm ngặt, nhưng nên được sử dụng cùng với chế độ nghiêm ngặt và được bật theo mặc định. Một cảnh báo xảy ra nếu
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.

    Bởi vì

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8 không được chấp nhận, bạn nên hy vọng nó sẽ bị xóa trong bản phát hành MySQL trong tương lai dưới dạng tên chế độ riêng biệt và hiệu ứng của nó có trong các hiệu ứng của chế độ SQL nghiêm ngặt.

  • SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    6

    Từ chối các truy vấn mà Danh sách chọn, điều kiện

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    71 hoặc danh sách
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    72 Tham khảo các cột không được tổng hợp không được đặt tên trong mệnh đề
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    73 cũng như không phụ thuộc vào chức năng (được xác định duy nhất bởi) các cột
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    73.

    Tiện ích mở rộng MySQL cho SQL tiêu chuẩn cho phép tham chiếu trong mệnh đề

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    71 cho các biểu thức bí danh trong danh sách chọn. Điều khoản
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    71 có thể đề cập đến các bí danh bất kể
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    6 có được bật hay không.

    Để thảo luận và ví dụ bổ sung, xem Phần & NBSP; 12.20.3, Xử lý nhóm MySQL của nhóm.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    78

    Theo mặc định, các không gian theo dõi được cắt từ các giá trị cột

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    79 khi truy xuất. Nếu
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    78 được bật, việc cắt tỉa không xảy ra và lấy các giá trị
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    79 được đệm theo chiều dài đầy đủ của chúng. Chế độ này không áp dụng cho các cột
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    82, trong đó các không gian theo dõi được giữ lại khi truy xuất.

    Ghi chú

    Kể từ MySQL 8.0.13,

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    78 không được chấp nhận. Hy vọng nó sẽ được loại bỏ trong một phiên bản tương lai của MySQL.

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    0
  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    84

    Đối xử với

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    85 như một toán tử nối chuỗi (giống như
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    86) chứ không phải là một từ đồng nghĩa với
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    87.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    88

    Đối xử với

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    89 như một từ đồng nghĩa với
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    90. Theo mặc định, MySQL coi
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    89 là từ đồng nghĩa với
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    92.

  • mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    5

    Kích hoạt chế độ SQL nghiêm ngặt cho tất cả các công cụ lưu trữ. Giá trị dữ liệu không hợp lệ bị từ chối. Để biết chi tiết, xem Chế độ SQL nghiêm ngặt.

  • SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    7

    Kích hoạt chế độ SQL nghiêm ngặt cho các công cụ lưu trữ giao dịch và khi có thể cho các công cụ lưu trữ không chuyển tiếp. Để biết chi tiết, xem Chế độ SQL nghiêm ngặt.

  • $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    95

    Kiểm soát xem làm tròn hay cắt ngắn xảy ra khi chèn giá trị

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    96,
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    7 hoặc
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    9 với phần giây phân số thành một cột có cùng loại nhưng ít chữ số phân số hơn. Hành vi mặc định là sử dụng làm tròn. Nếu chế độ này được bật, thay thế cắt cắt thay thế. Chuỗi câu sau đây minh họa sự khác biệt:

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    1

    Nội dung bảng kết quả trông như thế này, trong đó giá trị đầu tiên đã được làm tròn và thứ hai để cắt ngắn:

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    2

    Xem thêm Phần & NBSP; 11.2.6, Phần giây trong các giá trị thời gian.

Kết hợp các chế độ SQL

Các chế độ đặc biệt sau đây được cung cấp dưới dạng tốc ký cho các kết hợp các giá trị chế độ từ danh sách trước.

  • mysql> SET sql_mode = '';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 0
    mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 1
    8

    Tương đương với

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    88,
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    84,
    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    4,
    mysql> SET sql_mode='';
    mysql> CREATE TABLE test (c1 BIGINT UNSIGNED NOT NULL);
    mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t1;
    +-------+---------------------+------+-----+---------+-------+
    | Field | Type                | Null | Key | Default | Extra |
    +-------+---------------------+------+-----+---------+-------+
    | c2    | bigint(21) unsigned | NO   |     | 0       |       |
    +-------+---------------------+------+-----+---------+-------+
    
    mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
    mysql> DESCRIBE t2;
    +-------+------------+------+-----+---------+-------+
    | Field | Type       | Null | Key | Default | Extra |
    +-------+------------+------+-----+---------+-------+
    | c2    | bigint(21) | NO   |     | 0       |       |
    +-------+------------+------+-----+---------+-------+
    3 và
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    6.

    Chế độ

    mysql> SET sql_mode = '';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 0
    mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 1
    8 cũng khiến máy chủ trả về lỗi cho các truy vấn trong đó hàm đặt
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    06 có tham chiếu bên ngoài ____ 206 (____ 208) không thể được tổng hợp trong truy vấn bên ngoài mà tham chiếu bên ngoài đã được giải quyết. Đây là một truy vấn như vậy:
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    06(
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    08)
    cannot be aggregated in the outer query against which the outer reference has been resolved. This is such a query:

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    3

    Ở đây,

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    09 không thể tổng hợp trong truy vấn bên ngoài vì nó xuất hiện trong mệnh đề
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    10 của truy vấn đó. SQL tiêu chuẩn yêu cầu một lỗi trong tình huống này. Nếu chế độ
    mysql> SET sql_mode = '';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 0
    mysql> SET sql_mode = 'HIGH_NOT_PRECEDENCE';
    mysql> SELECT NOT 1 BETWEEN -5 AND 5;
            -> 1
    8 không được bật, máy chủ sẽ xử lý ____ 206 (________ 208) theo các truy vấn như vậy giống như cách nó sẽ diễn giải ____ 206 (________ 215).
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    06(
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    08)
    in such queries the same way that it would interpret
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    06(
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    15)
    .

    Xem Phần & NBSP; 1.7, Tuân thủ Tiêu chuẩn MySQL.

  • mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    0

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    0 tương đương với
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    7,
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    5,
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    8,
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    9,
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    0 và
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    1.

Chế độ SQL nghiêm ngặt

Chế độ nghiêm ngặt kiểm soát cách MySQL xử lý các giá trị không hợp lệ hoặc thiếu trong các câu lệnh thay đổi dữ liệu như

mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
2 hoặc
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
3. Một giá trị có thể không hợp lệ vì một số lý do. Ví dụ, nó có thể có loại dữ liệu sai cho cột hoặc nó có thể nằm ngoài phạm vi. Một giá trị bị thiếu khi một hàng mới được chèn không chứa giá trị cho cột Non -________ 74 không có mệnh đề
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
27 rõ ràng trong định nghĩa của nó. .

Nếu chế độ nghiêm ngặt không có hiệu lực, MySQL chèn các giá trị được điều chỉnh cho các giá trị không hợp lệ hoặc bị thiếu và tạo ra các cảnh báo (xem Phần & NBSP; 13.7.7.42, Báo cáo cảnh báo Show Show). Trong chế độ nghiêm ngặt, bạn có thể tạo ra hành vi này bằng cách sử dụng

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
7 hoặc
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
32.

Đối với các câu lệnh như

mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
0 không thay đổi dữ liệu, các giá trị không hợp lệ sẽ tạo ra cảnh báo ở chế độ nghiêm ngặt, không phải là lỗi.

Chế độ nghiêm ngặt tạo ra lỗi cho các nỗ lực tạo khóa vượt quá độ dài khóa tối đa. Khi chế độ nghiêm ngặt không được bật, điều này dẫn đến cảnh báo và cắt ngắn khóa theo chiều dài khóa tối đa.

Chế độ nghiêm ngặt không ảnh hưởng đến liệu các ràng buộc khóa nước ngoài có được kiểm tra hay không.

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
34 có thể được sử dụng cho điều đó. .

Chế độ SQL nghiêm ngặt có hiệu lực nếu

mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
5 hoặc
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
7 được bật, mặc dù các hiệu ứng của các chế độ này khác nhau phần nào:

  • Đối với các bảng giao dịch, xảy ra lỗi đối với các giá trị không hợp lệ hoặc bị thiếu trong câu lệnh thay đổi dữ liệu khi

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    5 hoặc
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    7 được bật. Tuyên bố bị hủy bỏ và lăn lại.

  • Đối với các bảng không chuyển hóa, hành vi này giống nhau đối với một trong hai chế độ nếu giá trị xấu xảy ra trong hàng đầu tiên được chèn hoặc cập nhật: câu lệnh bị hủy bỏ và bảng vẫn không thay đổi. Nếu câu lệnh chèn hoặc sửa đổi nhiều hàng và giá trị xấu xảy ra ở hàng thứ hai hoặc sau, kết quả phụ thuộc vào chế độ nghiêm ngặt nào được bật:

    • Đối với

      mysql> CREATE TABLE count (i INT);
      ERROR 1064 (42000): You have an error in your SQL syntax
      5, MySQL trả về lỗi và bỏ qua phần còn lại của các hàng. Tuy nhiên, vì các hàng trước đó đã được chèn hoặc cập nhật, kết quả là một bản cập nhật một phần. Để tránh điều này, hãy sử dụng các câu lệnh hàng đơn, có thể bị hủy bỏ mà không thay đổi bảng.

    • Đối với

      SET GLOBAL sql_mode = 'modes';
      SET SESSION sql_mode = 'modes';
      7, MySQL chuyển đổi giá trị không hợp lệ thành giá trị hợp lệ gần nhất cho cột và chèn giá trị được điều chỉnh. Nếu thiếu giá trị, MySQL sẽ chèn giá trị mặc định ngầm cho kiểu dữ liệu cột. Trong cả hai trường hợp, MySQL tạo ra cảnh báo thay vì lỗi và tiếp tục xử lý tuyên bố. Các mặc định ngầm được mô tả trong Phần & NBSP; 11.6, Kiểu dữ liệu Giá trị mặc định.

Chế độ nghiêm ngặt ảnh hưởng đến việc xử lý phân chia theo 0, 0 ngày và số không theo ngày như sau:

  • Chế độ nghiêm ngặt ảnh hưởng đến việc xử lý phân chia theo 0, bao gồm ____ 71,0):

    Đối với các hoạt động thay đổi dữ liệu (

    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    2,
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    3):

    • Nếu chế độ nghiêm ngặt không được bật, hãy phân chia bằng 0 chèn

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      4 và không tạo ra cảnh báo.

    • Nếu chế độ nghiêm ngặt được bật, phân chia theo 0 sẽ tạo ra lỗi, trừ khi

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6 cũng được đưa ra. Đối với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      7 và
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      8, bộ phận bằng 0 chèn
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      4 và tạo ra một cảnh báo.

    Đối với

    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0, bộ phận không trả lại
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4. Cho phép chế độ nghiêm ngặt gây ra cảnh báo cũng được tạo ra.

  • Chế độ nghiêm ngặt ảnh hưởng đến việc máy chủ cho phép

    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    2 là ngày hợp lệ:

    • Nếu chế độ nghiêm ngặt không được bật,

      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 được cho phép và chèn không tạo ra cảnh báo.

    • Nếu chế độ nghiêm ngặt được bật,

      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 không được phép và chèn tạo ra lỗi, trừ khi
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6 cũng được đưa ra. Đối với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      7 và
      $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
      47,
      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 được cho phép và chèn tạo ra một cảnh báo.

  • Chế độ nghiêm ngặt ảnh hưởng đến việc máy chủ cho phép ngày mà phần năm khác không nhưng phần tháng hoặc phần ngày là 0 (ngày như

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    55 hoặc
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    56):

    • Nếu chế độ nghiêm ngặt không được bật, ngày không được phép các bộ phận và chèn không tạo ra cảnh báo.

    • Nếu chế độ nghiêm ngặt được bật, ngày không được phép các phần bằng 0 và chèn tạo ra lỗi, trừ khi

      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6 cũng được đưa ra. Đối với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      7 và
      $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
      47, các ngày bằng không được chèn là
      mysql> CREATE TABLE `count` (i INT);
      Query OK, 0 rows affected (0.00 sec)
      2 (được coi là hợp lệ với
      mysql> SET sql_mode = '';
      Query OK, 0 rows affected (0.00 sec)
      
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
      6) và đưa ra cảnh báo.

Để biết thêm thông tin về chế độ nghiêm ngặt đối với

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6, hãy xem so sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt.

Chế độ nghiêm ngặt ảnh hưởng đến việc xử lý phân chia theo 0, 0 ngày và số 0 trong các ngày kết hợp với các chế độ

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
0,
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
9 và
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
8.

So sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt

Phần này so sánh hiệu quả đối với việc thực thi câu lệnh của từ khóa

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 (hạ cấp các lỗi đối với cảnh báo) và chế độ SQL nghiêm ngặt (nâng cấp cảnh báo về lỗi). Nó mô tả những tuyên bố mà chúng ảnh hưởng và lỗi nào họ áp dụng.

Bảng sau đây trình bày so sánh tóm tắt về hành vi câu lệnh khi mặc định là tạo ra lỗi so với cảnh báo. Một ví dụ về khi mặc định là tạo ra một lỗi đang chèn

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
4 vào cột
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
71. Một ví dụ về khi mặc định là tạo cảnh báo là chèn giá trị của loại dữ liệu sai vào một cột (chẳng hạn như chèn chuỗi
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
72 vào cột số nguyên).

Chế độ hoạt độngKhi câu lệnh mặc định là lỗiKhi tuyên bố mặc định là cảnh báo
Không có chế độ SQL
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 hoặc SQL nghiêm ngặt
LỗiCảnh báo
Với
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6
Cảnh báoVới
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6
Cảnh báo (giống như không có chế độ SQL
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 hoặc SQL nghiêm ngặt)
Với chế độ SQL nghiêm ngặtLỗi
Cảnh báoCảnh báoCảnh báo

Với

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6

  • Cảnh báo (giống như không có chế độ SQL

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 hoặc SQL nghiêm ngặt)

  • Với chế độ SQL nghiêm ngặt

Cảnh báo (giống như không có chế độ SQL
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 hoặc SQL nghiêm ngặt)

Với chế độ SQL nghiêm ngặt

Lỗi (giống như không có chế độ SQL

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 hoặc SQL nghiêm ngặt)

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
4

Với chế độ

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 và SQL nghiêm ngặt

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
5

Một kết luận để rút ra từ bảng là khi từ khóa

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 và chế độ SQL nghiêm ngặt đều có hiệu lực,
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 được ưu tiên. Điều này có nghĩa là, mặc dù
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 và chế độ SQL nghiêm ngặt có thể được coi là có tác dụng ngược lại trong việc xử lý lỗi, nhưng chúng không hủy bỏ khi được sử dụng cùng nhau.

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
6

Hiệu quả của việc bỏ qua đối với việc thực thi tuyên bố

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
7

Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnh

  • Một số câu lệnh trong MySQL hỗ trợ từ khóa

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 tùy chọn. Từ khóa này khiến máy chủ hạ cấp một số loại lỗi nhất định và tạo cảnh báo thay thế. Đối với một câu lệnh nhiều hàng, việc hạ cấp lỗi đối với cảnh báo có thể cho phép một hàng được xử lý. Mặt khác,
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 khiến tuyên bố bỏ qua hàng tiếp theo thay vì hủy bỏ. (Đối với các lỗi không đáng tin cậy, xảy ra lỗi bất kể từ khóa
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6.)

  • Ví dụ: Nếu bảng

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    84 có cột khóa chính
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    85 chứa các giá trị duy nhất, cố gắng chèn cùng một giá trị
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    85 vào nhiều hàng thường tạo ra lỗi khóa trùng lặp:

  • Với

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6, hàng chứa khóa trùng lặp vẫn chưa được chèn, nhưng cảnh báo xảy ra thay vì lỗi:

    Ví dụ: Nếu bảng

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    37 có cột
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    71
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    90, cố gắng chèn
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4 tạo ra lỗi trong chế độ SQL nghiêm ngặt:

  • Nếu chế độ SQL không nghiêm ngặt,

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 khiến
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4 được chèn dưới dạng cột mặc định ngầm (0 trong trường hợp này), cho phép hàng được xử lý mà không bỏ qua:

  • Các câu lệnh này hỗ trợ từ khóa

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6:

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
95:
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 không áp dụng cho các phần
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
25 hoặc
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
0 của câu lệnh nhưng để chèn vào bảng các hàng được tạo bởi
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+
| CAST(0 AS UNSIGNED) - 1 |
+-------------------------+
|                      -1 |
+-------------------------+
0. Các hàng sao chép một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ.

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
8
Với chế độ SQL nghiêm ngặt

Lỗi (giống như không có chế độ SQL

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 hoặc SQL nghiêm ngặt)strict SQL mode, the server upgrades certain warnings to errors.

Với chế độ

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 và SQL nghiêm ngặt

$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
9

Một kết luận để rút ra từ bảng là khi từ khóa

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 và chế độ SQL nghiêm ngặt đều có hiệu lực,
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 được ưu tiên. Điều này có nghĩa là, mặc dù
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 và chế độ SQL nghiêm ngặt có thể được coi là có tác dụng ngược lại trong việc xử lý lỗi, nhưng chúng không hủy bỏ khi được sử dụng cùng nhau.

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
0

Hiệu quả của việc bỏ qua đối với việc thực thi tuyên bố

Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnh

  • Một số câu lệnh trong MySQL hỗ trợ từ khóa

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 tùy chọn. Từ khóa này khiến máy chủ hạ cấp một số loại lỗi nhất định và tạo cảnh báo thay thế. Đối với một câu lệnh nhiều hàng, việc hạ cấp lỗi đối với cảnh báo có thể cho phép một hàng được xử lý. Mặt khác,
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 khiến tuyên bố bỏ qua hàng tiếp theo thay vì hủy bỏ. (Đối với các lỗi không đáng tin cậy, xảy ra lỗi bất kể từ khóa
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6.)

  • Ví dụ: Nếu bảng

    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    84 có cột khóa chính
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    85 chứa các giá trị duy nhất, cố gắng chèn cùng một giá trị
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    85 vào nhiều hàng thường tạo ra lỗi khóa trùng lặp:

  • Với

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6, hàng chứa khóa trùng lặp vẫn chưa được chèn, nhưng cảnh báo xảy ra thay vì lỗi:

  • Ví dụ: Nếu bảng

    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    37 có cột
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    71
    SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    90, cố gắng chèn
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4 tạo ra lỗi trong chế độ SQL nghiêm ngặt:

  • Nếu chế độ SQL không nghiêm ngặt,

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 khiến
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    4 được chèn dưới dạng cột mặc định ngầm (0 trong trường hợp này), cho phép hàng được xử lý mà không bỏ qua:

  • Các câu lệnh này hỗ trợ từ khóa

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6:

  • SET GLOBAL sql_mode = 'modes';
    SET SESSION sql_mode = 'modes';
    95:
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 không áp dụng cho các phần
    $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
    25 hoặc
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0 của câu lệnh nhưng để chèn vào bảng các hàng được tạo bởi
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0. Các hàng sao chép một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ.

  • SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    00:
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6 khiến MySQL bỏ qua các lỗi trong quá trình xóa hàng.

  • mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    2: Với
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
    6, các hàng trùng lặp một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ. Các hàng được đặt thành các giá trị sẽ gây ra lỗi chuyển đổi dữ liệu được đặt thành các giá trị hợp lệ gần nhất.

Đối với các bảng được phân vùng trong đó không tìm thấy phân vùng nào khớp với giá trị đã cho,

mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6 khiến hoạt động chèn không ngừng âm thầm đối với các hàng chứa giá trị chưa từng có.

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
05,
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
06: Với
mysql> SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(cast(0 as unsigned) - 1)'
6, các hàng trùng lặp một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ.

SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
1

Ghi chú

Bởi vì tiếp tục phát triển MySQL định nghĩa các lỗi mới, có thể có các lỗi không có trong danh sách trước đó mà chế độ SQL nghiêm ngặt áp dụng.