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
1, cũng xem xét biến hệ thốngmysql> 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ảngmysql> 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.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
Chế độ SQL mặc định trong MySQL 8.0 bao gồm các chế độ sau:
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.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
Kết hợp các chế độ SQL
Chế độ SQL nghiêm ngặt“partially done” update.
So sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt“strict 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
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ànhmysql> 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à 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ạtmysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
4.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]'
2mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Hãy coi
3 là ký tự trích dẫn định danh [như ký tự trích dẫnmysql> 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ụngmysql> 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ớimysql> 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 = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
8mysql> 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
Chế độ
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 = ''; 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,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.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ế độ này không được bật, phân chia bằng 0 chèn
2 và không tạo ra cảnh báo.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 | | +-------+------------+------+-----+---------+-------+
Nếu chế độ này được bật, phân chia bằng 0 chèn
2 và tạo ra cảnh báo.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 | | +-------+------------+------+-----+---------+-------+
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
4 cũng được đưa ra. Đối vớimysql> 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ènmysql> 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.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 với
8, phân chia theo số 0 trở lạimysql> 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ạtmysql> 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 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ếumysql> 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.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
Bởi vì
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> 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
5mysql> 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]
Ưu tiên của toán tử
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> 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]
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
1CREATE 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];
Cho phép khoảng trống giữa tên hàm và ký tự
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àmCREATE 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ụngCREATE 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: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];
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ế độ
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.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];
Để thảo luận thêm về
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];
8CREATE 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ộtCREATE 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];
00. Thông thường, bạn tạo số chuỗi tiếp theo cho cột bằng cách chènSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
2 hoặcmysql> 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 | | +-------+------------+------+-----+---------+-------+
02 vào nó.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
8 ngăn chặn hành vi này choCREATE 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];
02 để chỉSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
2 tạo ra số chuỗi tiếp theo.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 | | +-------+------------+------+-----+---------+-------+
Chế độ này có thể hữu ích nếu
02 được lưu trữ trong cộtSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
00 của bảng. . một trong đó đã bị đổ. Kích hoạtSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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épCREATE 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 theCREATE 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];
02 values, resulting in a table with contents different from the one that was dumped. EnablingSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
8 before reloading the dump file solves this problem. For this reason, mysqldump automatically includes in its output a statement that enablesCREATE 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];
12SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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 [
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ứcSELECT @@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;
15SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Khi tạo một bảng, hãy bỏ qua tất cả các chỉ thị
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.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
9mysql> 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
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ư
19 hoặcSELECT @@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.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Theo mặc định,
9 được bậ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
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
9 bị vô hiệu hóa, đối vớimysql> 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
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ớiSELECT @@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.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Với
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.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
26SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Phép trừ giữa các giá trị số nguyên, trong đó một loại thuộc loại
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:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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ế độ
26 SQL được bật, kết quả là âm:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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
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ếuSELECT @@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.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Khi
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ộtSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
32 trong BảngSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
33 với cộtSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
32 trong BảngSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
35:even if any operand is unsigned. For example, compare the type of columnSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
32 in tableSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
33 with that of columnSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
32 in tableSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
35:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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à
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ử.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
7mysql> 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
Chế độ
7 ảnh hưởng đến việc máy chủ cho phépmysql> 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 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.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Nếu chế độ này không được bật,
0 được cho phép và chèn không tạo ra cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Nếu chế độ này được bật,
0 được cho phép và chèn tạo ra một cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Nếu chế độ và chế độ nghiêm ngặt này được bật,
0 không được phép và chèn tạo ra lỗi, trừ khimysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
4 cũng được đưa ra. Đối vớimysql> 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 | | +-------+------------+------+-----+---------+-------+
45,SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0 được cho phép và chèn tạo ra một cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -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ếumysql> 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.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
Bởi vì
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
6mysql> 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
Chế độ
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ư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
53 hoặcSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
54, nhưng không phảiSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0. Chế độmysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
7.] Hiệu quả củamysql> 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.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
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à
0 và tạo ra cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
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
4 cũng được đưa ra. Đối vớimysql> 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=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
0 và đưa ra cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -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ếumysql> 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.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
Bởi vì
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
4mysql> 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
Từ chối các truy vấn mà danh sách chọn, điều kiện
69 hoặc danh sáchSELECT @@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ộtSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
71.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Tiện ích mở rộng MySQL cho SQL tiêu chuẩn cho phép tham chiếu trong mệnh đề
69 cho các biểu thức bí danh trong danh sách chọn. Điều khoảnSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
69 có thể đề cập đến các bí danh bất kểSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
4 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
Để 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.
76SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Theo mặc định, các không gian theo dõi được cắt từ các giá trị cột
77 khi truy xuất. NếuSELECT @@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ộtSELECT @@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.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Ghi chú
Kể từ MySQL 8.0.13,
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.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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]
82SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Đối xử với
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ớiSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
85.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
86SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Đối xử với
87 như một từ đồng nghĩa vớiSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
88. Theo mặc định, MySQL coiSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
87 là từ đồng nghĩa vớiSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
90.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
3mysql> 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]'
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.
5mysql> 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
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.
93SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Kiểm soát xem làm tròn hay cắt ngắn xảy ra khi chèn giá trị
94,SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
5 hoặcmysql> 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: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]'
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:
0SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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.
6mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Tương đương với
86,SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
82,SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
2,mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
1 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];
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
Chế độ
6 cũng khiến máy chủ trả về lỗi cho các truy vấn trong đó hàm đặtmysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
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
cannot be aggregated in the outer query against which the outer reference has been resolved. This is such a query:
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]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
1SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Ở đây,
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ảnmysql> 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> 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 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> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
in such queries the same way that it would interpret
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]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]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
Xem Phần & NBSP; 1.7, Tuân thủ Tiêu chuẩn MySQL.
8mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
8 tương đương vớimysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
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
3,mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6,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.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
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
3 hoặcmysql> 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 được bật. Tuyên bố bị hủy bỏ và lăn lạ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
Đố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
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.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]'
Đối với
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.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
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 [
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]: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ế độ nghiêm ngặt không được bật, hãy phân chia bằng 0 chèn
2 và không tạo ra cảnh báo.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 | | +-------+------------+------+-----+---------+-------+
Nếu chế độ nghiêm ngặt được bật, phân chia theo 0 sẽ tạo ra lỗi, trừ khi
4 cũng được đưa ra. Đối vớimysql> 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ènmysql> 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.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 với
8, phân chia theo số 0 trở lạimysql> 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.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 | | +-------+------------+------+-----+---------+-------+
Chế độ nghiêm ngặt ảnh hưởng đến việc máy chủ cho phép
0 là ngày hợp lệ:mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Nếu chế độ nghiêm ngặt không được bật,
0 được cho phép và chèn không tạo ra cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Nếu chế độ nghiêm ngặt được bật,
0 không được phép và chèn tạo ra lỗi, trừ khimysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
4 cũng được đưa ra. Đối vớimysql> 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 | | +-------+------------+------+-----+---------+-------+
45,SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0 được cho phép và chèn tạo ra một cảnh báo.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
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ư
53 hoặcSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
54]:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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
4 cũng được đưa ra. Đối vớimysql> 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 | | +-------+------------+------+-----+---------+-------+
45, các ngày bằng không được chèn làSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0 [được coi là hợp lệ vớimysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
4] và đưa ra cảnh báo.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 | | +-------+------------+------+-----+---------+-------+
Để 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].
Lỗi | Cảnh báo |
Cảnh báo | Với 4 |
Với chế độ SQL nghiêm ngặt | Lỗi |
Cảnh báo | Cả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 | |
+-------+------------+------+-----+---------+-------+
4Cảnh báo [giống như không có chế độ SQL
4 hoặc SQL nghiêm ngặt]mysql> SET sql_mode=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
Với chế độ SQL nghiêm ngặt
mysql> SET sql_mode='';
mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL];
mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test;
mysql> DESCRIBE t1;
+-------+---------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| c2 | bigint[21] unsigned | NO | | 0 | |
+-------+---------------------+------+-----+---------+-------+
mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION';
mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test;
mysql> DESCRIBE t2;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| c2 | bigint[21] | NO | | 0 | |
+-------+------------+------+-----+---------+-------+
4 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;
2Vớ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ặtSELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
3Mộ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;
4Hiệ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;
5Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnh
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
4 không áp dụng cho các phầnmysql> 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 | | +-------+------------+------+-----+---------+-------+
23 hoặcSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
8 của câu lệnh nhưng để chèn vào bảng các hàng được tạo bởimysql> 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> 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 | | +-------+------------+------+-----+---------+-------+
98: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 khiến MYSQL bỏ qua các lỗi trong quá trình xóa hà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 | | +-------+------------+------+-----+---------+-------+
0: Vớimysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4, cá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.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 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,
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> 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 | | +-------+------------+------+-----+---------+-------+
03,mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
04: Vớimysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
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=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
1: Vớimysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4, cá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ế.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 | | +-------+------------+------+-----+---------+-------+
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;
6Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnhMá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;
7Trong 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:
24SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
23SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
93mysql> 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 = ''; 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
0mysql> 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]'
03mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
04mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
19mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
1 [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]'
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;
9Ghi 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.