Hướng dẫn mysql shift - thay đổi mysql

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

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

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
1, cũng xem xét biến hệ thống
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
2. Nó cho phép kiểm tra lỗi bổ sung cho các bảng
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
1.

Đặ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ế độ.

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

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

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
1, cũng xem xét biến hệ thống
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
2. Nó cho phép kiểm tra lỗi bổ sung cho các bảng
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
1.

Chế độ SQL mặc định trong MySQL 8.0 bao gồm các chế độ 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
4,
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
5,
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
6,
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
7,
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 và
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
9.

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

Để đặt chế độ SQL tại khởi động máy chủ, hãy sử dụng tùy chọn

mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
0 "trên dòng lệnh hoặc
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
1" trong một tệp tùy chọn như
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
2 (Hệ điều hành UNIX) hoặc
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
3 (Windows).
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
4 là danh sách các chế độ khác nhau được phân tách bằng dấu phẩy. Để xóa chế độ SQL một cách rõ ràng, hãy đặt nó thành một chuỗi trống bằng cách sử dụng
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
5 trên dòng lệnh hoặc
mysql> CREATE TABLE count (i INT);
ERROR 1064 (42000): You have an error in your SQL syntax
6 trong một tệp tùy chọn.

Ghi chú 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.

Các chương trình cài đặt MySQL có thể định cấu hình chế độ SQL trong quá trình cài đặt.

Nếu chế độ SQL khác với mặc định hoặc với những gì bạn mong đợi, hãy kiểm tra cài đặt trong tệp tùy chọn mà máy chủ đọc khi khởi động.

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

    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
    1, cũng xem xét biến hệ thống
    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
    2. Nó cho phép kiểm tra lỗi bổ sung cho các bảng
    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
    1.

    Chế độ SQL mặc định trong MySQL 8.0 bao gồm các chế độ 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
    4,
    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
    5,
    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
    6,
    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
    7,
    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 và
    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
    9.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.

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

    Chế độ SQL nghiêm ngặtpartially done update.

So sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặtstrict mode, it means a mode with either or both

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
5 or
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)'
3 enabled.

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

    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)'
    4 bị vô hiệu hóa, máy chủ yêu cầu các giá trị tháng và ngày đó là hợp pháp và không chỉ trong phạm vi 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> 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)'
    9 được chuyển đổi thành
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0 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, kích hoạ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)'
    4.

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

    Hãy coi

    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    3 là ký tự trích dẫn định danh (như ký tự trích dẫn
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    4) và không phải là ký tự trích dẫn chuỗi. Bạn vẫn có thể sử dụng
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    4 để trích dẫn các định danh với chế độ này được bật. Với
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    2 đượ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.

  • 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ế độ

    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 ảnh hưởng đến việc xử lý phân chia theo 0, bao gồm ________ 69,0). Đối với các hoạt động thay đổi dữ liệu (
    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)'
    0,
    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)'
    1), 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='';
      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       |       |
      +-------+------------+------+-----+---------+-------+
      2 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='';
      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       |       |
      +-------+------------+------+-----+---------+-------+
      2 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='';
      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 cũng được đưa ra. Đối với
      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 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       |       |
      +-------+------------+------+-----+---------+-------+
      6, phân chia bằng 0 chèn
      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       |       |
      +-------+------------+------+-----+---------+-------+
      2 và tạo ra một cảnh báo.

    Đối với

    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       |       |
    +-------+------------+------+-----+---------+-------+
    8, phân chia theo số 0 trở lại
    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       |       |
    +-------+------------+------+-----+---------+-------+
    2. Kích hoạt
    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 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.

    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 chấp nhận.
    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 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
    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 bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.

    Bởi vì

    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 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> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
    5

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

    mysql> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
    6 là các biểu thức như
    mysql> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
    7 được phân tích cú pháp là
    mysql> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
    8. 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> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
    9. Hành vi cấp cao cao hơn có thể thu được bằng cách cho phép chế độ
    mysql> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
    5 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
  • CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    1

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

    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    2. Đ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
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    3, việc sử dụng
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    4 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ế độ

    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    1 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ể
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    1 có được bật hay không.

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

    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    1, xem Phần & NBSP; 9.2.5, Phân tích tên chức năng và độ phân giải của chức năng.

  • CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8

    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8 ảnh hưởng đến việc xử lý các cột
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    00. 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='';
    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       |       |
    +-------+------------+------+-----+---------+-------+
    2 hoặc
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    02 vào nó.
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8 ngăn chặn hành vi này cho
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    02 để 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       |       |
    +-------+------------+------+-----+---------+-------+
    2 tạo ra số chuỗi tiếp theo.

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    02 được lưu trữ trong cột
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    00 của bảng. . một trong đó đã bị đổ. Kích hoạt
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8 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
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8.mysqldump and then reload it, MySQL normally generates new sequence numbers when it encounters the
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    02 values, resulting in a table with contents different from the one that was dumped. Enabling
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8 before reloading the dump file solves this problem. For this reason, mysqldump automatically includes in its output a statement that enables
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    8.

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

    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 (

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    13) 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
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    14 được thay đổi để không sử dụng ký tự thoát.

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

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    16 và
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    17. Tùy chọn này rất hữu ích trên các máy chủ bản sao.

  • 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
    9

    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ư

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    19 hoặc
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    20 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,

    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
    9 đượ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

    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
    9 bị vô hiệu hóa, đối với
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    23, độ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
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    24, một cảnh báo xảy ra và bảng không bị thay đổi.

    Với

    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
    9 đượ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.

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

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    27, 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ế độ

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    26 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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    27, 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
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    26 đượ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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    26 đượ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
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    32 trong Bảng
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    33 với cột
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    32 trong Bảng
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    35:even if any operand is unsigned. For example, compare the type of column
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    32 in table
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    33 with that of column
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    32 in table
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    35:

    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à

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    36 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ử.

  • 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
    7

    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
    7 ảnh hưởng đến việc máy chủ cho phép
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0 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> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      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,

      mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 đượ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> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 không được phép và chèn tạo ra lỗi, trừ khi
      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 cũng được đưa ra. Đối với
      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 và
      SELECT @@GLOBAL.sql_mode;
      SELECT @@SESSION.sql_mode;
      45,
      mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 được cho phép và chèn tạo ra một cảnh báo.

    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
    7 không được chấp nhận.
    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
    7 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
    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
    7 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.

    Bởi vì

    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
    7 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 = '';
    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
    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
    6 ả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ư
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    53 hoặc
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    54, nhưng không phải
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0. 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
    7.) Hiệu quả của
    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
    6 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> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 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='';
      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 cũng được đưa ra. Đối với
      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 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       |       |
      +-------+------------+------+-----+---------+-------+
      6, ngày không có các bộ phận được chèn là
      mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 và đưa ra cảnh báo.

    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
    6 không dùng nữa.
    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
    6 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
    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
    6 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.

    Bởi vì

    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
    6 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 = '';
    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
    4

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    69 hoặc danh sách
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    70 Tham khảo các cột không được phân chia không được đặt tên trong mệnh đề
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    71 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
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    71.

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    69 cho các biểu thức bí danh trong danh sách chọn. Điều khoản
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    69 có thể đề cập đến các bí danh bất kể
    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
    4 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.

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

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    77 khi truy xuất. Nếu
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    76 được bật, việc cắt tỉa không xảy ra và lấy các giá trị
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    77 đượ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
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    80, 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,

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    76 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> CREATE TABLE t1 (c1 CHAR(10));
    Query OK, 0 rows affected (0.37 sec)
    
    mysql> INSERT INTO t1 (c1) VALUES('xy');
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------+-----------------+
    | c1   | CHAR_LENGTH(c1) |
    +------+-----------------+
    | xy   |               2 |
    +------+-----------------+
    1 row in set (0.00 sec)
    
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT c1, CHAR_LENGTH(c1) FROM t1;
    +------------+-----------------+
    | c1         | CHAR_LENGTH(c1) |
    +------------+-----------------+
    | xy         |              10 |
    +------------+-----------------+
    1 row in set (0.00 sec)
  • SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    82

    Đối xử với

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    83 như một toán tử nối chuỗi (giống như
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    84) chứ không phải là từ đồng nghĩa với
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    85.

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

    Đối xử với

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    87 như một từ đồng nghĩa với
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    88. Theo mặc định, MySQL coi
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    87 là từ đồng nghĩa với
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    90.

  • 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)'
    3

    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.

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

    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.

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

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

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    94,
    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)'
    5 hoặ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)'
    7 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:

    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);

    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:

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

    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> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    6

    Tương đương với

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    86,
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    82,
    mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    2,
    CREATE TABLE t (id INT, tval TIME(1));
    SET sql_mode='';
    INSERT INTO t (id, tval) VALUES(1, 1.55);
    SET sql_mode='TIME_TRUNCATE_FRACTIONAL';
    INSERT INTO t (id, tval) VALUES(2, 1.55);
    1 và
    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
    4.

    Chế độ

    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    6 cũng khiến máy chủ trả về lỗi cho các truy vấn trong đó hàm đặt
    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
    04 có tham chiếu bên ngoài ____ 204 (____ 206) 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:
    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
    04(
    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
    06)
    cannot be aggregated in the outer query against which the outer reference has been resolved. This is such a query:

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

    Ở đây,

    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
    07 không thể tổng hợp trong truy vấn bên ngoài vì nó xuất hiện trong điều khoản
    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
    08 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> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    6 không được bật, máy chủ sẽ xử lý ____ 204 (________ 206) theo các truy vấn như vậy giống như cách nó sẽ diễn giải ____ 204 (________ 213).
    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
    04(
    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
    06)
    in such queries the same way that it would interpret
    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
    04(
    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
    13)
    .

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

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

    mysql> CREATE TABLE `count` (i INT);
    Query OK, 0 rows affected (0.00 sec)
    8 tương đương với
    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
    5,
    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)'
    3,
    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
    6,
    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
    7,
    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 và
    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
    9.

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> 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)'
0 hoặ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)'
1. 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 -________ 72 không có mệnh đề
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
25 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='';
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 hoặ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
30.

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

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       |       |
+-------+------------+------+-----+---------+-------+
8 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.

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
32 có thể được sử dụng cho điều đó. .

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

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)'
3 hoặ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
5 đượ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> 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)'
    3 hoặ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
    5 đượ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> 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)'
      3, 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

      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
      5, 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 ____ ____ 69,0):

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

    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)'
    0,
    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)'
    1):

    • 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='';
      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       |       |
      +-------+------------+------+-----+---------+-------+
      2 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='';
      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 cũng được đưa ra. Đối với
      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 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       |       |
      +-------+------------+------+-----+---------+-------+
      6, phân chia bằng 0 chèn
      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       |       |
      +-------+------------+------+-----+---------+-------+
      2 và tạo ra một cảnh báo.

    Đối với

    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       |       |
    +-------+------------+------+-----+---------+-------+
    8, phân chia theo số 0 trở lại
    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       |       |
    +-------+------------+------+-----+---------+-------+
    2. 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> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
    mysql> SELECT CAST(0 AS UNSIGNED) - 1;
    +-------------------------+
    | CAST(0 AS UNSIGNED) - 1 |
    +-------------------------+
    |                      -1 |
    +-------------------------+
    0 là ngày hợp lệ:

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

      mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 đượ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> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 không được phép và chèn tạo ra lỗi, trừ khi
      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 cũng được đưa ra. Đối với
      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 và
      SELECT @@GLOBAL.sql_mode;
      SELECT @@SESSION.sql_mode;
      45,
      mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 đượ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ư

    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    53 hoặc
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    54):

    • 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='';
      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 cũng được đưa ra. Đối với
      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 và
      SELECT @@GLOBAL.sql_mode;
      SELECT @@SESSION.sql_mode;
      45, các ngày bằng không được chèn là
      mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
      mysql> SELECT CAST(0 AS UNSIGNED) - 1;
      +-------------------------+
      | CAST(0 AS UNSIGNED) - 1 |
      +-------------------------+
      |                      -1 |
      +-------------------------+
      0 (được coi là hợp lệ với
      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) 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='';
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, 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 ngày kết hợp với các 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,
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
7 và
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
6.

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='';
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 (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='';
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       |       |
+-------+------------+------+-----+---------+-------+
2 vào cột
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
69. 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
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
70 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='';
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 hoặc SQL nghiêm ngặt
LỗiCảnh báo
Với
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
Cảnh báoVới
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
Cảnh báo (giống như không có chế độ SQL
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 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='';
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

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

    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 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='';
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 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='';
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 hoặc SQL nghiêm ngặt)

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

Với 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       |       |
+-------+------------+------+-----+---------+-------+
4 và SQL nghiêm ngặt

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

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

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 và chế độ SQL nghiêm ngặt đều có hiệu lực,
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 được ưu tiên. Điều này có nghĩa là, mặc dù
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 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.

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

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

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

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

  • 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
    93:
    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 không áp dụng cho các phần
    SELECT @@GLOBAL.sql_mode;
    SELECT @@SESSION.sql_mode;
    23 hoặc
    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       |       |
    +-------+------------+------+-----+---------+-------+
    8 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='';
    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       |       |
    +-------+------------+------+-----+---------+-------+
    8. 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> 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
    98:
    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 khiến MYSQL bỏ qua các lỗi trong quá trình xóa hà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)'
    0: Với
    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, 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='';
    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 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ó.

  • mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    03,
    mysql> CREATE TABLE count (i INT);
    ERROR 1064 (42000): You have an error in your SQL syntax
    04: Với
    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, 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ỏ.

  • 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)'
    1: Với
    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, các hàng mà xung đột khóa trùng lặp xảy ra trên một giá trị khóa duy nhất không được cập nhật. Các hàng được cập nhật lên các giá trị sẽ gây ra lỗi chuyển đổi dữ liệu được cập nhật lên các giá trị hợp lệ gần nhất thay thế.

Từ khóa

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 áp dụng cho các lỗi IGNULE sau:

SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
6
Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnh

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

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
0. Trong chế độ SQL nghiêm ngặt, máy chủ nâng cấp một số cảnh báo nhất định thành lỗi.strict SQL mode, the server upgrades certain warnings to errors.

Ví dụ: ở chế độ SQL không nghiêm ngặt, chèn chuỗi

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
70 vào cột số nguyên dẫn đến việc chuyển đổi giá trị thành 0 và cảnh báo:

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

Trong chế độ SQL nghiêm ngặt, giá trị không hợp lệ bị từ chối với lỗi:

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

Để biết thêm thông tin về các cài đặt có thể của biến hệ thống

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
0, xem Phần & NBSP; 5.1.11, chế độ SQL Server SQL.

Chế độ SQL nghiêm ngặt áp dụng cho các câu lệnh sau trong các điều kiện mà một số giá trị có thể nằm ngoài phạm vi hoặc một hàng không hợp lệ được chèn vào hoặc xóa khỏi bảng:

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

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

  • 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
    93

  • 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
    98 (cả bảng đơn và nhiều bả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)'
    0

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

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

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

  • 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)'
    1 (cả bảng đơn và nhiều bảng)

Trong các chương trình được lưu trữ, các câu lệnh riêng lẻ của các loại chỉ được liệt kê thực thi ở chế độ SQL nghiêm ngặt nếu chương trình được xác định trong khi chế độ nghiêm ngặt có hiệu lực.

Chế độ SQL nghiêm ngặt áp dụng cho các lỗi sau, biểu thị một lớp lỗi trong đó giá trị đầu vào không hợp lệ hoặc thiếu. Giá trị không hợp lệ nếu nó có kiểu dữ liệu sai cho cột hoặc có thể nằm ngoài phạm vi. Một giá trị bị thiếu nếu một hàng mới được chèn không chứa giá trị cho cột

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
69 không có mệnh đề
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
25 rõ ràng trong định nghĩa của nó.

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

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.