$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"26MySQL Strict Mode. The latest versions of PHPKB Knowledge Base Management Software does not require MySQL Strict Mode to be turned OFF. It was a requirement for older versions [version 8 or older] of PHPKB software.
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
25
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
95 SQL_MODE in my.cnf file [for Linux] OR my.ini file [for windows server] and restarting the MySQL server. my.cnf file can be found in one of a few locations [depending on which distribution you're using]. The most common locations are /etc/my.cnf and /etc/mysql/my.cnf .Lưu ý: Thực hiện các thay đổi sau trong My.ini [đối với hệ điều hành Windows] hoặc My.cnf [đối với hệ điều hành Linux]. . Nó có thể trông như thế này [giá trị thực của SQL_Mode có thể thay đổi]: Make the following changes in the my.ini [for Windows Operating System] or my.cnf [for Linux Operating System]. Inside that file, look for a heading like [mysqld] and then look for the value of sql_mode. It might look like this [the actual value of sql_mode may vary]:
- Hãy tìm dòng sau: SQL-mode = "strict_trans_tables, no_auto_create_user, no_engine_substures"
sql-mode = "STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" - Bạn có thể thay đổi giá trị của SQL_MODE thành NO_Engine_SubStr Hurne sang chế độ hoàn toàn nghiêm ngặt, nhưng bạn có thể muốn tra cứu từng chế độ được định cấu hình trước khi vô hiệu hóa nó hoặc bạn có thể thay đổi nó thành: SQL-mode = "" [tức là trống] nếu SQL_Mode Không được đặt, bạn có thể thêm nó dưới tiêu đề [MySQLD], sau đó lưu tệp và khởi động lại MySQL.
sql-mode="" [i.e. Blank]
If sql_mode isn't set, you can add it under the [mysqld] heading, then save the file, and restart MySQL. - Khởi động lại & nbsp; Dịch vụ MySQL.the MySQL Service.
HOẶC
2. Để tắt chế độ nghiêm ngặt qua SQL
Phương pháp này cho phép bạn vô hiệu hóa chế độ nghiêm ngặt trên máy chủ MySQL của mình bằng cách chạy lệnh sau.
$ mysql -u root -p -e "SET GLOBAL sql_mode = 'NO_ENGINE_SUBSTITUTION';"
Bây giờ, bạn có thể xác minh rằng chế độ được đặt bằng cách chạy như sau:
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
Đó là tất cả! & NBSP; Tài liệu đầy đủ để thiết lập các chế độ MySQL có sẵn trên trang Chế độ SQL của máy chủ trong tài liệu MySQL. Một mô tả về tất cả các chế độ cũng có sẵn trên trang đó.
5.1.11 & NBSP; Chế độ SQL máy chủ
Máy chủ MySQL có thể hoạt động ở các chế độ SQL khác nhau và có thể áp dụng các chế độ này khác nhau cho các máy khách khác nhau, tùy thuộc vào giá trị của biến hệ thống
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2. DBA có thể đặt chế độ SQL toàn cầu để phù hợp với các yêu cầu vận hành máy chủ trang web và mỗi ứng dụng có thể đặt chế độ SQL phiên của mình thành các yêu cầu của riêng mình.Các chế độ ảnh hưởng đến cú pháp SQL Hỗ trợ MySQL và kiểm tra xác thực dữ liệu mà nó thực hiện. Điều này giúp sử dụng MySQL dễ dàng hơn trong các môi trường khác nhau và sử dụng MySQL cùng với các máy chủ cơ sở dữ liệu khác.
Đặt chế độ SQL
Các chế độ SQL quan trọng nhất
Danh sách đầy đủ các chế độ SQL
Kết hợp các chế độ SQL
Chế độ SQL nghiêm ngặt
So sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt
Để biết câu trả lời cho các câu hỏi thường được hỏi về các chế độ SQL của máy chủ trong MySQL, xem Phần & NBSP; A.3, MYSQL 8.0 FAQ: Máy chủ SQL Chế độ.
Khi làm việc với các bảng
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
3, cũng xem xét biến hệ thống SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
4. Nó cho phép kiểm tra lỗi bổ sung cho các bảng SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
3.Đặt chế độ SQL
Các chế độ SQL quan trọng nhất
Danh sách đầy đủ các chế độ SQL
Ghi chú
Bởi vì tiếp tục phát triển MySQL định nghĩa các lỗi mới, có thể có các lỗi không có trong danh sách trước đó mà chế độ SQL nghiêm ngặt áp dụng.
5.1.11 & NBSP; Chế độ SQL máy chủ
Máy chủ MySQL có thể hoạt động ở các chế độ SQL khác nhau và có thể áp dụng các chế độ này khác nhau cho các máy khách khác nhau, tùy thuộc vào giá trị của biến hệ thống
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2. DBA có thể đặt chế độ SQL toàn cầu để phù hợp với các yêu cầu vận hành máy chủ trang web và mỗi ứng dụng có thể đặt chế độ SQL phiên của mình thành các yêu cầu của riêng mình.SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
Các chế độ ảnh hưởng đến cú pháp SQL Hỗ trợ MySQL và kiểm tra xác thực dữ liệu mà nó thực hiện. Điều này giúp sử dụng MySQL dễ dàng hơn trong các môi trường khác nhau và sử dụng MySQL cùng với các máy chủ cơ sở dữ liệu khác.
Để xác định cài đặt toàn cầu hoặc phiên
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2 hiện tại, hãy chọn giá trị của nó:SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
Quan trọng
Chế độ SQL và phân vùng do người dùng xác định. & NBSP; Thay đổi chế độ SQL máy chủ sau khi tạo và chèn dữ liệu vào các bảng được phân vùng có thể gây ra những thay đổi lớn trong hành vi của các bảng đó và có thể dẫn đến mất hoặc tham nhũng dữ liệu. Chúng tôi khuyên bạn không bao giờ thay đổi chế độ SQL khi bạn đã tạo các bảng sử dụng phân vùng do người dùng xác định. Changing the server SQL mode after creating and inserting data into partitioned tables can cause major changes in the behavior of such tables, and could lead to loss or corruption of data. It is strongly recommended that you never change the SQL mode once you have created tables employing user-defined partitioning.
Khi sao chép các bảng được phân vùng, các chế độ SQL khác nhau trên nguồn và bản sao cũng có thể dẫn đến các vấn đề. Để có kết quả tốt nhất, bạn phải luôn sử dụng cùng chế độ SQL máy chủ trên nguồn và bản sao.
Để biết thêm thông tin, xem Phần & NBSP; 24.6, Hạn chế và hạn chế về phân vùng.
Các chế độ SQL quan trọng nhất
Các giá trị
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
2 quan trọng nhất có lẽ là sau:
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ế độ này thay đổi cú pháp và hành vi để phù hợp hơn với SQL tiêu chuẩn. Đây là một trong những chế độ kết hợp đặc biệt được liệt kê ở cuối phần này.
7SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Nếu một giá trị không thể được chèn như được đưa vào bảng giao dịch, hãy hủy bỏ tuyên bố. Đối với một bảng không chuyển hóa, hãy hủy bỏ câu lệnh nếu giá trị xảy ra trong một câu lệnh hàng đơn hoặc hàng đầu tiên của câu lệnh nhiều hàng. Thông tin chi tiết được đưa ra sau trong phần này.
0mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Làm cho MySQL hoạt động giống như một hệ thống cơ sở dữ liệu SQL truyền thống của người Viking. Một mô tả đơn giản về chế độ này là Lỗi Lỗi thay vì cảnh báo khi chèn giá trị không chính xác vào cột. Đây là một trong những chế độ kết hợp đặc biệt được liệt kê ở cuối phần này.“traditional” SQL database system. A simple description of this mode is “give an error instead of a warning” when inserting an incorrect value into a column. It is one of the special combination modes listed at the end of this section.
Ghi chú
Với chế độ
0 được bật,mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
2 hoặcmysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
3 bị hủy bỏ ngay khi xảy ra lỗi. Nếu bạn đang sử dụng một công cụ lưu trữ không chuyển thể, đây có thể không phải là thứ bạn muốn vì các thay đổi dữ liệu được thực hiện trước khi lỗi có thể không được quay lại, dẫn đến bản cập nhật một phần được thực hiện trên mạng.“partially done” update.mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Khi hướng dẫn này đề cập đến chế độ nghiêm ngặt, thì có nghĩa là một chế độ có hoặc cả
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
7 hoặc mysql> CREATE TABLE count [i INT];
ERROR 1064 [42000]: You have an error in your SQL syntax
5 được bật.“strict mode,” it means a mode with
either or both SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
7 or mysql> CREATE TABLE count [i INT];
ERROR 1064 [42000]: You have an error in your SQL syntax
5 enabled. Danh sách đầy đủ các chế độ SQL
Danh sách sau đây mô tả tất cả các chế độ SQL được hỗ trợ:
6mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Không thực hiện kiểm tra đầy đủ ngày. Chỉ kiểm tra rằng tháng nằm trong khoảng từ 1 đến 12 và ngày nằm trong khoảng từ 1 đến 31. Điều này có thể hữu ích cho các ứng dụng web có được năm, tháng và ngày trong ba trường khác nhau và lưu trữ chính xác những gì người dùng chèn, mà không cần xác nhận ngày. Chế độ này áp dụng cho các cột
7 vàmysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
8. Nó không áp dụng cho các cộtmysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
9, luôn yêu cầu một ngày hợp lệ.mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Với
6 bị vô hiệu hóa, máy chủ yêu cầu giá trị tháng và ngày đó là hợp pháp và không chỉ trong khoảng 1 đến 12 và 1 đến 31, tương ứng. Với chế độ nghiêm ngặt bị vô hiệu hóa, các ngày không hợp lệ nhưmysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
1 được chuyển đổi thànhmysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
2 và cảnh báo được tạo ra. Với chế độ nghiêm ngặt được bật, ngày không hợp lệ tạo ra lỗi. Để cho phép ngày như vậy, bậtmysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
6.mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
4mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Hãy coi
5 là ký tự trích dẫn định danh [như ký tự trích dẫnmysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
6] và không phải là ký tự trích dẫn chuỗi. Bạn vẫn có thể sử dụngmysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
6 để trích dẫn các định danh với chế độ này được bật. Vớimysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
4 được bật, bạn không thể sử dụng dấu ngoặc kép để trích dẫn các chuỗi theo nghĩa đen vì chúng được hiểu là định danh.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
0SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Chế độ
0 ảnh hưởng đến việc xử lý phân chia theo 0, bao gồm ________ 71,0]. Đối với các hoạt động thay đổi dữ liệu [SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
2,mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
3], hiệu ứng của nó cũng phụ thuộc vào liệu chế độ SQL nghiêm ngặt có được bật hay không.mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Nếu chế độ này không được bật, phân chia bằng 0 chèn
4 và không tạo ra cảnh báo.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 được bật, phân chia bằng 0 chèn
4 và tạo ra cảnh báo.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ế độ và chế độ nghiêm ngặt này được bật, phân chia theo 0 sẽ tạo ra lỗi, trừ khi
6 cũng được đưa ra. Đối 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]'
7 vàmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
8, bộ phận bằng 0 chènmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4 và tạo ra một cảnh báo.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
0, bộ phận không trả lạimysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
4. Cho phépmysql> 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 gây ra cảnh báo cũng được tạo ra, bất kể chế độ nghiêm ngặt có được bật hay không.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0 không được chấp nhận.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0 không phải là một phần của chế độ nghiêm ngặt, nhưng nên được sử dụng cùng với chế độ nghiêm ngặt và được bật theo mặc định. Cảnh báo xảy ra nếuSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
0 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Bởi vì
0 không được chấp nhận, bạn nên hy vọng nó sẽ bị xóa trong bản phát hành MySQL trong tương lai dưới dạng tên chế độ riêng biệt và hiệu ứng của nó có trong các hiệu ứng của chế độ SQL nghiêm ngặt.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
7mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Ưu tiên của toán tử
8 là các biểu thức nhưmysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
9 được phân tích cú pháp làmysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
0. Trong một số phiên bản cũ hơn của MySQL, biểu thức được phân tích cú pháp làmysql> SET sql_mode=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
1. Hành vi cấp cao cao hơn có thể thu được bằng cách cho phép chế độmysql> SET sql_mode=''; 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 | | +-------+------------+------+-----+---------+-------+
7 SQL.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 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
3mysql> 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 | | +-------+------------+------+-----+---------+-------+
Cho phép khoảng trống giữa tên hàm và ký tự
4. Điều này gây ra tên chức năng tích hợp được coi là từ dành riêng. Do đó, các định danh giống như tên hàm phải được trích dẫn như được mô tả trong Phần & NBSP; 9.2, tên đối tượng Schema Lược đồ. Ví dụ: vì có hàmmysql> SET sql_mode=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
5, việc sử dụngmysql> SET sql_mode=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
6 làm tên bảng trong câu lệnh sau gây ra lỗi:mysql> 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 | | +-------+------------+------+-----+---------+-------+
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ế độ
3 SQL áp dụng cho các chức năng tích hợp, không phải cho các hàm có thể tải hoặc các chức năng được lưu trữ. Luôn luôn được phép có các khoảng trắng sau một hàm có thể tải hoặc tên chức năng được lưu trữ, bất kểmysql> SET sql_mode=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
3 có được bật hay không.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 | | +-------+------------+------+-----+---------+-------+
Để thảo luận thêm về
3, xem Phần & NBSP; 9.2.5, Phân tích tên chức năng và độ phân giả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 | | +-------+------------+------+-----+---------+-------+
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00 ảnh hưởng đến việc xử lý các cột$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
02. Thông thường, bạn tạo số chuỗi tiếp theo cho cột bằng cách chèn
4 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]'
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
04 vào nó.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00 ngăn chặn hành vi này cho$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
04 để chỉ
4 tạo ra số chuỗi tiếp theo.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]'
Chế độ này có thể hữu ích nếu
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
04 đã được lưu trữ trong cột ____102 của bảng. . một trong đó đã bị đổ. Kích hoạt$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00 Trước khi tải lại tệp Dump giải quyết vấn đề này. Vì lý do này, MySQLDump tự động bao gồm trong đầu ra của nó một câu lệnh cho phép$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00.mysqldump and then reload it, MySQL normally generates new sequence numbers when it encounters the$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
04 values, resulting in a table with contents different from the one that was dumped. Enabling$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00 before reloading the dump file solves this problem. For this reason, mysqldump automatically includes in its output a statement that enables$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
00.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
14Kích hoạt chế độ này vô hiệu hóa việc sử dụng ký tự dấu gạch chéo ngược [
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
15] làm ký tự thoát trong chuỗi và số nhận dạng. Với chế độ này được bật, dấu gạch chéo ngược trở thành một ký tự thông thường như bất kỳ ký tự nào khác và chuỗi thoát mặc định cho các biểu thức$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
16 được thay đổi để không sử dụng ký tự thoát.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
17Khi tạo một bảng, hãy bỏ qua tất cả các chỉ thị
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
18 và$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
19. Tùy chọn này rất hữu ích trên các máy chủ bản sao.
1SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Kiểm soát thay thế tự động của công cụ lưu trữ mặc định khi một câu lệnh như
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
21 hoặc$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
22 Chỉ định một công cụ lưu trữ bị vô hiệu hóa hoặc không được biên dịch.Theo mặc định,
1 được bật.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
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
1 bị vô hiệu hóa, đối vớiSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
25, động cơ mặc định được sử dụng và cảnh báo xảy ra nếu động cơ mong muốn không có sẵn. Đối với$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
26, một cảnh báo xảy ra và bảng không bị thay đổi.Với
1 được bật, xảy ra lỗi và bảng không được tạo hoặc thay đổi nếu không có động cơ mong muốn.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
28Phép trừ giữa các giá trị số nguyên, trong đó một loại thuộc loại
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
29, tạo ra kết quả không dấu theo mặc định. Nếu kết quả khác sẽ là âm, kết quả lỗi:mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
Nếu chế độ
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
28 SQL được bật, kết quả là âm:mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
Nếu kết quả của một thao tác như vậy được sử dụng để cập nhật cột số nguyên
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
29, kết quả sẽ được cắt theo giá trị tối đa cho loại cột hoặc được cắt thành 0 nếu$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
28 được bật. Với chế độ SQL nghiêm ngặt được bật, xảy ra lỗi và cột vẫn không thay đổi.Khi
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
28 được bật, kết quả trừ được ký kết, ngay cả khi bất kỳ toán hạng nào không được ký. Ví dụ: so sánh loại cột$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
34 trong Bảng$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
35 với cột$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
34 trong Bảng$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
37:even if any operand is unsigned. For example, compare the type of column$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
34 in table$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
35 with that of column$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
34 in table$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
37:mysql> SET sql_mode=''; mysql> CREATE TABLE test [c1 BIGINT UNSIGNED NOT NULL]; mysql> CREATE TABLE t1 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t1; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c2 | bigint[21] unsigned | NO | | 0 | | +-------+---------------------+------+-----+---------+-------+ mysql> SET sql_mode='NO_UNSIGNED_SUBTRACTION'; mysql> CREATE TABLE t2 SELECT c1 - 1 AS c2 FROM test; mysql> DESCRIBE t2; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c2 | bigint[21] | NO | | 0 | | +-------+------------+------+-----+---------+-------+
Điều này có nghĩa là
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
38 không thể sử dụng 100% trong tất cả các bối cảnh. Xem Phần & NBSP; 12.11, Chức năng Cast Cast và toán tử.
9SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Chế độ
9 ảnh hưởng đến việc máy chủ cho phépSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
2 là một ngày hợp lệ. Hiệu ứng của nó cũng phụ thuộc vào việc chế độ SQL nghiêm ngặt được bật.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Nếu chế độ này không được bật,
2 được cho phép và chèn không tạo ra cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Nếu chế độ này được bật,
2 được cho phép và chèn tạo ra một cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Nếu chế độ và chế độ nghiêm ngặt này được bật,
2 không được phép và chèn tạo ra lỗi, trừ khimysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
6 cũng được đưa ra. Đối 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]'
7 vàmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
47,
2 được cho phép và chèn tạo ra một cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
9 không được chấp nhận.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
9 không phải là một phần của chế độ nghiêm ngặt, nhưng nên được sử dụng cùng với chế độ nghiêm ngặt và được bật theo mặc định. Cảnh báo xảy ra nếuSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
9 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Bởi vì
9 không được chấp nhận, bạn nên hy vọng nó sẽ bị xóa trong bản phát hành MySQL trong tương lai dưới dạng tên chế độ riêng biệt và hiệu ứng của nó có trong các hiệu ứng của chế độ SQL nghiêm ngặt.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
8SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Chế độ
8 ảnh hưởng đến việc máy chủ cho phép ngày trong đó phần năm khác không nhưng phần tháng hoặc phần ngày là 0. [chế độ này ảnh hưởng đến ngày nhưSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
55 hoặc$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
56, nhưng không phải
2. Chế độmysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
9.] Hiệu quả củaSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
8 cũng phụ thuộc vào việc chế độ SQL nghiêm ngặt có được bật hay không.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
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à
2 và tạo ra cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
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
6 cũng được đưa ra. Đối 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]'
7 vàmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
8, các ngày bằng không được chèn làmysql> 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]'
2 và đưa ra cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
8 không được chấp nhận.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
8 không phải là một phần của chế độ nghiêm ngặt, nhưng nên được sử dụng cùng với chế độ nghiêm ngặt và được bật theo mặc định. Một cảnh báo xảy ra nếuSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
8 được bật mà không cho phép chế độ nghiêm ngặt hoặc ngược lại.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
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.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
6SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Từ chối các truy vấn mà Danh sách chọn, điều kiện
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
71 hoặc danh sách$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
72 Tham khảo các cột không được tổng hợp không được đặt tên trong mệnh đề$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
73 cũng như không phụ thuộc vào chức năng [được xác định duy nhất bởi] các cột$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
73.Tiện ích mở rộng MySQL cho SQL tiêu chuẩn cho phép tham chiếu trong mệnh đề
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
71 cho các biểu thức bí danh trong danh sách chọn. Điều khoản$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
71 có thể đề cập đến các bí danh bất kể
6 có được bật hay không.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Để thảo luận và ví dụ bổ sung, xem Phần & NBSP; 12.20.3, Xử lý nhóm MySQL của nhóm.
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
78Theo mặc định, các không gian theo dõi được cắt từ các giá trị cột
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
79 khi truy xuất. Nếu$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
78 được bật, việc cắt tỉa không xảy ra và lấy các giá trị$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
79 được đệm theo chiều dài đầy đủ của chúng. Chế độ này không áp dụng cho các cột$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
82, trong đó các không gian theo dõi được giữ lại khi truy xuất.Ghi chú
Kể từ MySQL 8.0.13,
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
78 không được chấp nhận. Hy vọng nó sẽ được loại bỏ trong một phiên bản tương lai của MySQL.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
0$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
84Đối xử với
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
85 như một toán tử nối chuỗi [giống như$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
86] chứ không phải là một từ đồng nghĩa với$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
87.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
88Đối xử với
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
89 như một từ đồng nghĩa với$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
90. Theo mặc định, MySQL coi$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
89 là từ đồng nghĩa với$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
92.
5mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
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.
7SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Kích hoạt chế độ SQL nghiêm ngặt cho các công cụ lưu trữ giao dịch và khi có thể cho các công cụ lưu trữ không chuyển tiếp. Để biết chi tiết, xem Chế độ SQL nghiêm ngặt.
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
95Kiểm soát xem làm tròn hay cắt ngắn xảy ra khi chèn giá trị
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
96,
7 hoặcmysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
9 với phần giây phân số thành một cột có cùng loại nhưng ít chữ số phân số hơn. Hành vi mặc định là sử dụng làm tròn. Nếu chế độ này được bật, thay thế cắt cắt thay thế. Chuỗi câu sau đây minh họa sự khác biệt:mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
1Nội dung bảng kết quả trông như thế này, trong đó giá trị đầu tiên đã được làm tròn và thứ hai để cắt ngắn:
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
2Xem 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.
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
Tương đương với
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
88,$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
84,
4,mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
3 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.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Chế độ
8 cũng khiến máy chủ trả về lỗi cho các truy vấn trong đó hàm đặtmysql> 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 có tham chiếu bên ngoài ____ 206 [____ 208] không thể được tổng hợp trong truy vấn bên ngoài mà tham chiếu bên ngoài đã được giải quyết. Đây là một truy vấn như vậy:SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
cannot be aggregated in the outer query against which the outer reference has been resolved. This is such a query:
06[SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
08]SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
3Ở đây,
09 không thể tổng hợp trong truy vấn bên ngoài vì nó xuất hiện trong mệnh đềSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
10 của truy vấn đó. SQL tiêu chuẩn yêu cầu một lỗi trong tình huống này. Nếu chế độSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
8 không được bật, máy chủ sẽ xử lý ____ 206 [________ 208] theo các truy vấn như vậy giống như cách nó sẽ diễn giải ____ 206 [________ 215].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
in such queries the same way that it would interpret
06[SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
08]SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
.
06[SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
15]SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Xem Phần & NBSP; 1.7, Tuân thủ Tiêu chuẩn MySQL.
0mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
0 tương đương vớimysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
7,SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
5,mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
8,SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
9,SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
0 vàSELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
1.SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
Chế độ SQL nghiêm ngặt
Chế độ nghiêm ngặt kiểm soát cách MySQL xử lý các giá trị không hợp lệ hoặc thiếu trong các câu lệnh thay đổi dữ liệu như
mysql> CREATE TABLE count [i INT];
ERROR 1064 [42000]: You have an error in your SQL syntax
2 hoặc mysql> CREATE TABLE count [i INT];
ERROR 1064 [42000]: You have an error in your SQL syntax
3. Một giá trị có thể không hợp lệ vì một số lý do. Ví dụ, nó có thể có loại dữ liệu sai cho cột hoặc nó có thể nằm ngoài phạm vi. Một giá trị bị thiếu khi một hàng mới được chèn không chứa giá trị cho cột Non -________ 74 không có mệnh đề SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
27 rõ ràng trong định nghĩa của nó. .Nếu chế độ nghiêm ngặt không có hiệu lực, MySQL chèn các giá trị được điều chỉnh cho các giá trị không hợp lệ hoặc bị thiếu và tạo ra các cảnh báo [xem Phần & NBSP; 13.7.7.42, Báo cáo cảnh báo Show Show]. Trong chế độ nghiêm ngặt, bạn có thể tạo ra hành vi này bằng cách sử dụng
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
7 hoặc SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
32.Đối với các câu lệnh như
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
+-------------------------+
| CAST[0 AS UNSIGNED] - 1 |
+-------------------------+
| -1 |
+-------------------------+
0 không thay đổi dữ liệu, các giá trị không hợp lệ sẽ tạo ra cảnh báo ở chế độ nghiêm ngặt, không phải là lỗi.Chế độ nghiêm ngặt tạo ra lỗi cho các nỗ lực tạo khóa vượt quá độ dài khóa tối đa. Khi chế độ nghiêm ngặt không được bật, điều này dẫn đến cảnh báo và cắt ngắn khóa theo chiều dài khóa tối đa.
Chế độ nghiêm ngặt không ảnh hưởng đến liệu các ràng buộc khóa nước ngoài có được kiểm tra hay không.
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
34 có thể được sử dụng cho điều đó. .Chế độ SQL nghiêm ngặt có hiệu lực nếu
mysql> CREATE TABLE count [i INT];
ERROR 1064 [42000]: You have an error in your SQL syntax
5 hoặc SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
7 được bật, mặc dù các hiệu ứng của các chế độ này khác nhau phần nào:Đối với các bảng giao dịch, xảy ra lỗi đối với các giá trị không hợp lệ hoặc bị thiếu trong câu lệnh thay đổi dữ liệu khi
5 hoặcmysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
7 được bật. Tuyên bố bị hủy bỏ và lăn lại.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Đố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
5, MySQL trả về lỗi và bỏ qua phần còn lại của các hàng. Tuy nhiên, vì các hàng trước đó đã được chèn hoặc cập nhật, kết quả là một bản cập nhật một phần. Để tránh điều này, hãy sử dụng các câu lệnh hàng đơn, có thể bị hủy bỏ mà không thay đổi bảng.mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Đối với
7, MySQL chuyển đổi giá trị không hợp lệ thành giá trị hợp lệ gần nhất cho cột và chèn giá trị được điều chỉnh. Nếu thiếu giá trị, MySQL sẽ chèn giá trị mặc định ngầm cho kiểu dữ liệu cột. Trong cả hai trường hợp, MySQL tạo ra cảnh báo thay vì lỗi và tiếp tục xử lý tuyên bố. Các mặc định ngầm được mô tả trong Phần & NBSP; 11.6, Kiểu dữ liệu Giá trị mặc định.SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Chế độ nghiêm ngặt ảnh hưởng đến việc xử lý phân chia theo 0, 0 ngày và số không theo ngày như sau:
Chế độ nghiêm ngặt ảnh hưởng đến việc xử lý phân chia theo 0, bao gồm ____ 71,0]:
Đối với các hoạt động thay đổi dữ liệu [
2,mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
3]:mysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
Nếu chế độ nghiêm ngặt không được bật, hãy phân chia bằng 0 chèn
4 và không tạo ra cảnh báo.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 được bật, phân chia theo 0 sẽ tạo ra lỗi, trừ khi
6 cũng được đưa ra. Đối 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]'
7 vàmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
8, bộ phận bằng 0 chènmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4 và tạo ra một cảnh báo.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
0, bộ phận không trả lạimysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
4. 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 = ''; 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]'
Chế độ nghiêm ngặt ảnh hưởng đến việc máy chủ cho phép
2 là ngày hợp lệ:mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Nếu chế độ nghiêm ngặt không được bật,
2 được cho phép và chèn không tạo ra cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Nếu chế độ nghiêm ngặt được bật,
2 không được phép và chèn tạo ra lỗi, trừ khimysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
6 cũng được đưa ra. Đối 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]'
7 vàmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
47,
2 được cho phép và chèn tạo ra một cảnh báo.mysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
Chế độ nghiêm ngặt ảnh hưởng đến việc máy chủ cho phép ngày mà phần năm khác không nhưng phần tháng hoặc phần ngày là 0 [ngày như
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
55 hoặc$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
56]:Nếu chế độ nghiêm ngặt không được bật, ngày không được phép các bộ phận và chèn không tạo ra cảnh báo.
Nếu chế độ nghiêm ngặt được bật, ngày không được phép các phần bằng 0 và chèn tạo ra lỗi, trừ khi
6 cũng được đưa ra. Đối 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]'
7 vàmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
47, các ngày bằng không được chèn là
2 [được coi là hợp lệ vớimysql> CREATE TABLE `count` [i INT]; Query OK, 0 rows affected [0.00 sec]
6] và đưa ra cảnh báo.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]'
Để biết thêm thông tin về chế độ nghiêm ngặt đối với
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6, hãy xem so sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt.Chế độ nghiêm ngặt ảnh hưởng đến việc xử lý phân chia theo 0, 0 ngày và số 0 trong các ngày kết hợp với các chế độ
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
0, SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
9 và SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
8.So sánh từ khóa bỏ qua và chế độ SQL nghiêm ngặt
Phần này so sánh hiệu quả đối với việc thực thi câu lệnh của từ khóa
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 [hạ cấp các lỗi đối với cảnh báo] và chế độ SQL nghiêm ngặt [nâng cấp cảnh báo về lỗi]. Nó mô tả những tuyên bố mà chúng ảnh hưởng và lỗi nào họ áp dụng.Bảng sau đây trình bày so sánh tóm tắt về hành vi câu lệnh khi mặc định là tạo ra lỗi so với cảnh báo. Một ví dụ về khi mặc định là tạo ra một lỗi đang chèn
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4 vào cột SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
71. Một ví dụ về khi mặc định là tạo cảnh báo là chèn giá trị của loại dữ liệu sai vào một cột [chẳng hạn như chèn chuỗi SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
72 vào cột số nguyên].
Lỗi | Cảnh báo |
Cảnh báo | Với 6 |
Với chế độ SQL nghiêm ngặt | Lỗi |
Cảnh báo | Cảnh báo |
Với
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6Cảnh báo [giống như không có chế độ SQL
6 hoặc SQL nghiêm ngặt]mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
Với chế độ SQL nghiêm ngặt
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 hoặc SQL nghiêm ngặt]Với chế độ SQL nghiêm ngặt
Lỗi [giống như không có chế độ SQL
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 hoặc SQL nghiêm ngặt]$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"4
Với chế độ
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 và SQL nghiêm ngặt$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"5
Một kết luận để rút ra từ bảng là khi từ khóa
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 và chế độ SQL nghiêm ngặt đều có hiệu lực, mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 được ưu tiên. Điều này có nghĩa là, mặc dù mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 và chế độ SQL nghiêm ngặt có thể được coi là có tác dụng ngược lại trong việc xử lý lỗi, nhưng chúng không hủy bỏ khi được sử dụng cùng nhau.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"6
Hiệu quả của việc bỏ qua đối với việc thực thi tuyên bố
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"7
Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnh
Một số câu lệnh trong MySQL hỗ trợ từ khóa
6 tùy chọn. Từ khóa này khiến máy chủ hạ cấp một số loại lỗi nhất định và tạo cảnh báo thay thế. Đối với một câu lệnh nhiều hàng, việc hạ cấp lỗi đối với cảnh báo có thể cho phép một hàng được xử lý. Mặt khác,mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 khiến tuyên bố bỏ qua hàng tiếp theo thay vì hủy bỏ. [Đối với các lỗi không đáng tin cậy, xảy ra lỗi bất kể từ khóamysql> 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 = ''; 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]'
Ví dụ: Nếu bảng
84 có cột khóa chínhSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
85 chứa các giá trị duy nhất, cố gắng chèn cùng một giá trịSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
85 vào nhiều hàng thường tạo ra lỗi khóa trùng lặp:SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Với
6, hàng chứa khóa trùng lặp vẫn chưa được chèn, nhưng cảnh báo xảy ra thay vì lỗi: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]'
Ví dụ: Nếu bảng
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
37 có cột
71SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
90, cố gắng chènSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
4 tạo ra lỗi trong chế độ SQL nghiêm ngặt:mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
Nếu chế độ SQL không nghiêm ngặt,
6 khiếnmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4 được chèn dưới dạng cột mặc định ngầm [0 trong trường hợp này], cho phép hàng được xử lý mà không bỏ qua: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]'
Các câu lệnh này hỗ trợ từ khóa
6: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]'
SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
95: mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 không áp dụng cho các phần $ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"25 hoặc
mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
+-------------------------+
| CAST[0 AS UNSIGNED] - 1 |
+-------------------------+
| -1 |
+-------------------------+
0 của câu lệnh nhưng để chèn vào bảng các hàng được tạo bởi mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
+-------------------------+
| CAST[0 AS UNSIGNED] - 1 |
+-------------------------+
| -1 |
+-------------------------+
0. Các hàng sao chép một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ.$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"8Với chế độ SQL nghiêm ngặt
Lỗi [giống như không có chế độ SQL
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 hoặc SQL nghiêm ngặt]“strict” SQL mode, the server upgrades certain warnings to errors. Với chế độ
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 và SQL nghiêm ngặt$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"9
Một kết luận để rút ra từ bảng là khi từ khóa
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 và chế độ SQL nghiêm ngặt đều có hiệu lực, mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 được ưu tiên. Điều này có nghĩa là, mặc dù mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 và chế độ SQL nghiêm ngặt có thể được coi là có tác dụng ngược lại trong việc xử lý lỗi, nhưng chúng không hủy bỏ khi được sử dụng cùng nhau.SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
0Hiệu quả của việc bỏ qua đối với việc thực thi tuyên bố
Hiệu quả của chế độ SQL nghiêm ngặt đối với thực thi câu lệnh
Một số câu lệnh trong MySQL hỗ trợ từ khóa
6 tùy chọn. Từ khóa này khiến máy chủ hạ cấp một số loại lỗi nhất định và tạo cảnh báo thay thế. Đối với một câu lệnh nhiều hàng, việc hạ cấp lỗi đối với cảnh báo có thể cho phép một hàng được xử lý. Mặt khác,mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 khiến tuyên bố bỏ qua hàng tiếp theo thay vì hủy bỏ. [Đối với các lỗi không đáng tin cậy, xảy ra lỗi bất kể từ khóamysql> 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 = ''; 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]'
Ví dụ: Nếu bảng
84 có cột khóa chínhSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
85 chứa các giá trị duy nhất, cố gắng chèn cùng một giá trịSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
85 vào nhiều hàng thường tạo ra lỗi khóa trùng lặp:SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
Với
6, hàng chứa khóa trùng lặp vẫn chưa được chèn, nhưng cảnh báo xảy ra thay vì lỗi: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]'
Ví dụ: Nếu bảng
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
37 có cột
71SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
90, cố gắng chènSET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
4 tạo ra lỗi trong chế độ SQL nghiêm ngặt:mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
Nếu chế độ SQL không nghiêm ngặt,
6 khiếnmysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
4 được chèn dưới dạng cột mặc định ngầm [0 trong trường hợp này], cho phép hàng được xử lý mà không bỏ qua: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]'
Các câu lệnh này hỗ trợ từ khóa
6: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]'
95:SET GLOBAL sql_mode = 'modes'; SET SESSION sql_mode = 'modes';
6 không áp dụng cho các phầnmysql> 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]'
$ mysql -u root -p -e "SELECT @@GLOBAL.sql_mode;"
25 hoặc
0 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 = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
0. Các hàng sao chép một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ.mysql> SET sql_mode = 'NO_UNSIGNED_SUBTRACTION'; mysql> SELECT CAST[0 AS UNSIGNED] - 1; +-------------------------+ | CAST[0 AS UNSIGNED] - 1 | +-------------------------+ | -1 | +-------------------------+
00:SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
6 khiến MySQL bỏ qua các lỗi trong quá trình xóa hàng.mysql> SET sql_mode = ''; Query OK, 0 rows affected [0.00 sec] mysql> SELECT CAST[0 AS UNSIGNED] - 1; ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
2: Vớimysql> CREATE TABLE count [i INT]; ERROR 1064 [42000]: You have an error in your SQL syntax
6, các hàng trùng lặp một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ. Các hàng được đặt thành các giá trị sẽ gây ra lỗi chuyển đổi dữ liệu được đặt thành các giá trị hợp lệ gần nhất.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 các bảng được phân vùng trong đó không tìm thấy phân vùng nào khớp với giá trị đã cho,
mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6 khiến hoạt động chèn không ngừng âm thầm đối với các hàng chứa giá trị chưa từng có.
SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
05, SELECT @@GLOBAL.sql_mode;
SELECT @@SESSION.sql_mode;
06: Với mysql> SET sql_mode = '';
Query OK, 0 rows affected [0.00 sec]
mysql> SELECT CAST[0 AS UNSIGNED] - 1;
ERROR 1690 [22003]: BIGINT UNSIGNED value is out of range in '[cast[0 as unsigned] - 1]'
6, các hàng trùng lặp một hàng hiện có trên một giá trị khóa duy nhất bị loại bỏ.SET GLOBAL sql_mode = 'modes';
SET SESSION sql_mode = 'modes';
1Ghi 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.