MySQL 5.7의 기본 SQL 모드에는 ONLY_FULL_GROUP_BY
, STRICT_TRANS_TABLES
, NO_ZERO_IN_DATE
, NO_ZERO_DATE
, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER
및 NO_ENGINE_SUBSTITUTION
. ONLY_FULL_GROUP_BY
, STRICT_TRANS_TABLES
, NO_ZERO_IN_DATE
, NO_ZERO_DATE
, ERROR_FOR_DIVISION_BY_ZERO
, NO_AUTO_CREATE_USER
, and NO_ENGINE_SUBSTITUTION
。
这是MySQL官网的原文描述:“These modes were added to the default SQL mode in MySQL 5.7: The ONLY_FULL_GROUP_BY
and STRICT_TRANS_TABLES
modes were added in MySQL 5.7.5. The NO_AUTO_CREATE_USER
mode was added in MySQL 5.7.7. The ERROR_FOR_DIVISION_BY_ZERO
, NO_ZERO_DATE
, and NO_ZERO_IN_DATE
modes were added in MySQL 5.7.8. For additional discussion regarding these changes to the default SQL mode value, see SQL Mode Changes in MySQL 5.7.”
SELECT @@GLOBAL.sql_mode; SELECT @@SESSION.sql_mode;
设置为GLOBAL,那么所有的客户端都会受到影响,不过要拥有SUPER权限才能进行设置,也就是root用户,设置SESSION,那么受影响的只是当前的连接会话。
SET GLOBAL sql_mode ='ONLY_FULL_GROUP_BY' SET SESSION sql_mode ='ONLY_FULL_GROUP_BY'
下面我们就针对默认设置的这几种SQL mode进行详细的讲解,其他的哪些大家可以去官网参考。
docs.oracle.com/cd/E17952_0…
设置了这个值,如果使用GROUP BY,在SELECT后面出现的字段,在GROUP BY后面必须出现,不然报错如下
Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'blue.shop.price' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
如下使用的是MySQL默认的sql_mode
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
那么下面的语句就会报错,因为GROUP BY后面只有一个字段,而SELECT * 是查出所有字段,所以就报错。
SELECT * FROM shop GROUP BY article
这样写就不会报错
SELECT * FROM shop GROUP BY article , dealer , price
不过我们不可能使用一个GROUP BY,后面还要跟着所有字段,显然不合理,那么就应该将其关闭,只需要将其去掉就行
MySQL的严格模式可以控制如何处理INSERT或UPDATE语句中的无效或缺失的值。一个值可能因多种原因无效。例如,它可能具有列的错误数据类型,或者它可能超出了范围。缺少非空列的值没有在定义中明确指定默认值,则插入的新行会出现该问题。
比如我们的某个字段设置不能为NULL,而我们插入的数据这个字段为NULL,那么就不能通过,就会报错如下:
1364 - Field 'dealer' doesn't have a default value
那么这个问题要怎么解决呢?我相信这个问题大家经常遇到,一般是我们在插入数据的时候实体的属性没有赋值,所以导致这个问题,所以我们会去检查代码,然后给属性赋值,另外一种做法就是去除STRICT_TRANS_TABLES
,这样就不会进行校验,不过是极其不推荐这样做的,因为要我们要保证数据的完整性,所以必须在代码层面做好工作。
NO_ZERO_IN_DATE模式会影响服务器是否允许年部分不为零但月或日部分为0的日期。(该模式影响日期,如“2010-00-01”或“2010-01-00”,但不影响“0000-00-00”。要控制服务器是否允许'0000-00-00',请使用NO_ZERO_DATE模式。)NO_ZERO_IN_DATE的效果还取决于是否启用严格SQL模式,如果没有启用严格SQL模式STRICT_TRANS_TABLES
,那么启用了NO_ZERO_IN_DATE也没用。
如下SQL的日期月和日为0,启用了严格模式STRICT_TRANS_TABLES
和NO_ZERO_IN_DATE,那么就会报错。
INSERT INTO `blue`.`shop` (`article`, `dealer` ,`price`,`date`) VALUES ('商品5', '5', 5.00, '2022-00-00');
1292 - Incorrect datetime value: '2022-00-00' for column 'date' at row 1
去除严格模式STRICT_TRANS_TABLES
和NO_ZERO_IN_DATE
就不会报错。
上面的NO_ZERO_IN_DATE可以插入'0000-00-00',如果使用了严格模式STRICT_TRANS_TABLES
ONLY_FULL_GROUP_BY
및 STRICT_TRANS_TABLES
모드가 MySQL에 추가되었습니다. 5.7.5 NO_AUTO_CREATE_USER
모드가 MySQL 5.7.7에 추가되었습니다. ERROR_FOR_DIVISION_BY_ZERO
, NO_ZERO_DATE
및 NO_ZERO_IN_DATE
모드는 MySQL 5.7.8에 추가되었습니다. 기본 SQL 모드 값에 대한 추가 설명은 MySQL 5.7의 SQL 모드 변경 사항을 참조하세요."show sql modeINSERT INTO `blue`.`shop` (`article`,dealer ,`price`,`date`) VALUES ('商品5', '5', MOD(10,0), '0000-00-00');set sql modeset to GLOBAL, then all 클라이언트 모두 영향을 받지만 이를 설정하려면 SUPER 권한이 있어야 합니다. 즉, 루트 사용자가 SESSION을 설정하면 현재 연결 세션만 영향을 받습니다.
docs.oracle.com/cd/E17952_0…기본 SQL 모드ONLY_FULL_GROUP_BY🎜🎜가 이 값을 설정하는 경우 SELECT 뒤에 나타나는 필드는 GROUP BY 뒤에 나타나야 합니다. 그렇지 않으면 오류가 발생합니다. 🎜🎜🎜SELECT 목록의 식 3은 GROUP BY 절에 없으며 GROUP BY 절의 열에 기능적으로 종속되지 않는 집계되지 않은 열 'blue.shop.price'를 포함합니다. 이는 sql_mode=only_full_group_by🎜🎜 🎜다음과 같이 사용하면 MySQL의 기본 sql_mode🎜🎜🎜ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION🎜🎜🎜다음 문은 필드가 하나뿐이므로 오류를 보고합니다. GROUP BY 뒤에 SELECT *는 모든 필드를 찾습니다. 오류를 보고하세요. 🎜SELECT price / 0 FROM shop아래에서는 기본 SQL 모드에 대해 자세히 설명합니다. 기타 자세한 내용은 공식 홈페이지를 참조하세요.
CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest🎜이렇게 작성하면 오류가 보고되지 않습니다🎜
SHOW CREATE TABLE store🎜그러나 GROUP BY를 사용하여 모든 필드를 사용하는 것은 명백히 무리이므로 닫고 삭제해야 합니다.🎜🎜STRICT_TRANS_TABLES🎜🎜 MySQL의 엄격 모드는 INSERT 또는 UPDATE 문에서 유효하지 않거나 누락된 값을 처리하는 방법을 제어합니다. 여러 가지 이유로 값이 유효하지 않을 수 있습니다. 예를 들어 열에 대한 데이터 유형이 잘못되었거나 범위를 벗어났을 수 있습니다. 이 문제는 Null이 아닌 열의 값이 누락되고 기본값이 정의에 명시적으로 지정되지 않은 곳에 삽입된 새 행에 대해 발생합니다. 🎜🎜예를 들어 필드 설정 중 하나가 NULL이 될 수 없고 삽입한 데이터 필드가 NULL인 경우 통과하지 못하고 다음과 같이 오류가 보고됩니다. 🎜🎜🎜1364 - '딜러' 필드는 그렇지 않습니다. 기본값이 없습니다🎜 🎜🎜이 문제를 어떻게 해결해야 할까요? 일반적으로 엔터티의 속성에는 데이터를 삽입할 때 값이 할당되지 않기 때문에 이러한 문제가 발생하므로 코드를 확인한 후 속성에 값을 할당하는 방법도 있습니다.
STRICT_TRANS_TABLES
, 이런 방식으로 확인이 수행되지는 않지만 데이터의 무결성을 보장해야 하므로 코드 수준에서 작업을 잘 수행해야 하기 때문에 매우 권장되지 않습니다. 🎜🎜NO_ZERO_IN_DATE🎜🎜NO_ZERO_IN_DATE 모드는 서버가 연도 부분은 0이 아니지만 월 또는 일 부분은 0인 날짜를 허용하는지 여부에 영향을 줍니다. (이 모드는 '2010-00-01' 또는 '2010-01-00'과 같은 날짜에 영향을 주지만 '0000-00-00'에는 영향을 미치지 않습니다. 서버가 '0000-00-00'을 허용하는지 여부를 제어하려면 NO_ZERO_DATE 모드를 사용하십시오. .) NO_ZERO_IN_DATE의 효과는 엄격한 SQL 모드 활성화 여부에 따라 달라집니다. 엄격한 SQL 모드 STRICT_TRANS_TABLES
가 활성화되지 않은 경우 NO_ZERO_IN_DATE를 활성화해도 소용이 없습니다. 🎜🎜다음 SQL의 날짜, 월, 일은 0이고 엄격 모드 STRICT_TRANS_TABLES
및 NO_ZERO_IN_DATE가 활성화된 경우 오류가 보고됩니다. 🎜CREATE TABLE `store` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci🎜🎜1292 - 잘못된 날짜/시간 값: 1🎜🎜🎜행 1🎜🎜🎜엄격 모드
STRICT_TRANS_TABLES
및 NO_ZERO_IN_DATE
를 제거하면 'date' 열에 대한 '2022-00-00'이 제거되지 않습니다. 작업 오류가 보고됩니다. 🎜🎜NO_ZERO_DATE🎜🎜위 NO_ZERO_IN_DATE에는 '0000-00-00'을 삽입할 수 있습니다. 엄격 모드 STRICT_TRANS_TABLES
및 NO_ZERO_DATE를 사용하면 '0000-00-00'을 삽입할 수 없습니다. 🎜🎜ERROR_FOR_DIVISION_BY_ZERO🎜🎜INSERT나 UPDATE의 경우 배당이 0이면 에러가 발생하여 데이터를 삽입할 수 없습니다. MOD(N,M)🎜SHOW ENGINES;🎜SELECT의 경우 배당이 0이면, 그러면 NULL이 반환됩니다. MOD(N,M)도 마찬가지입니다. 🎜rrreee🎜🎜오류 메시지: 1365 - Division by 0🎜🎜🎜NO_AUTO_CREATE_USER🎜🎜 grant 명령을 사용하여 비밀번호가 비어 있는 사용자를 생성할 수 없습니다. 🎜
如果指定了NO_ENGINE_SUBSTITUTION,我们在创建表或者修改表的时候,如果去指定了不存在或者不支持的存储引擎,那么就会报错,无法创建和修改,如果没有配置NO_ENGINE_SUBSTITUTION,那么就会将我们指定的存储引擎(不支持或者不存在)的存储引擎替换为默认的存储引擎,MySQL5.7后的默认存储引擎为InnoDB,所以就会自动设置为InnoDB。
如下我们创建表,将存储引擎设置为一个不存在的InnoDBTest
,因为我们去除了NO_ENGINE_SUBSTITUTION,所以不会报错,并且会替换成默认的InnoDB
创建sql
CREATE TABLE store ( `name` VARCHAR ( 255 ) DEFAULT NULL ) ENGINE = InnoDBTest
查看创建过程
SHOW CREATE TABLE store
结果
CREATE TABLE `store` ( `name` varchar(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
SHOW ENGINES;
위 내용은 MySQL의 기본 SQL 모드를 설정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!