my sql 이 Boolean 유형 으로 돌아 가 는 몇 가지 상황 에 대해 말씀 드 리 겠 습 니 다.

mysql 부 울 타 입 되 돌리 기
在这里插入图片描述
첫 번 째 상황,바로 돌아 가기

select id='22aa' from mytest where age=202    1     true
select count(*)=1 from mytest where age=202    1     true
select count(*)=0 from mytest where age=202    0     false
select count(*)<3 from mytest where age=202    1     true
select count(*)<=1 from mytest where age=202    1     true
select name="aa" from mytest where age=10   name null ,sql    ,      nul,        sql 3      
요약:
이런 상황 은 자바 의 판단 문 과 유사 하 다.자바 에 서 는=값 을 부여 한 다 는 뜻 이 므 로==로 판단 하 였 으 며,my sql 에 서 는 값 을 set 로 판단 하여 직접 사용 하 였 습 니 다.
두 번 째 상황 은 0 또는 1 로 돌아 가도 목적 을 달성 할 수 있다.

select enable from mytest where age=202    1      true
select count(*) from mytest    4      Boolean  ,  false
select enable from mytest where age=201   null       Boolean  ,       
select id from mytest where age=202     '22aa'       Boolean  ,  false
select id from mytest where age=202     'true'       Boolean  ,  true
select id from mytest where age=202     'false'       Boolean  ,false
//    
select * from mytest    Expected one result (or null) to be returned by selectOne(), but found: 4
select * from mytest where age=202        false 2019-08-28 202 15 1 ,     false
select * from mytest where age=202        true 2019-08-28 202 15 1 ,     true
select * from mytest where age=202        aaaa2019-08-28 202 15 1 ,     false
요약:
Mybatis 는 조 회 된 기록 수 에 따라 변 환 됩 니 다(1=true,0=false)
주의해 야 할 부분:여러 개의 기록(1 이상)을 조회 하면 false 로 돌아 갑 니 다.이 때 는 우리 가 기대 하 는 것 과 정반 대 입 니 다.여기 서 다른 방법 으로 바 꿀 수 있 고 기록 수 를 되 돌려 판단 할 수 있 으 며 데이터 베이스 에 기록 하 는 것 이 유일한 것 임 을 보증 할 수 있다.첫 번 째 상황 으로 직접 해결 할 수도 있 습 니 다.
4,5,6 조 sql 문장의 테스트 에 따 르 면 문자열 이"true"라면 true 로 봉 할 수 있 고"false"라면 false 로 봉 할 수 있 으 며 다른 정의 문자열 은 모두 false 입 니 다.
(추측 이 정확 하지 않 습 니 다.my sql 홈 페이지 에서 찾 아야 합 니 다.되 돌아 오 는 필드 가 문자열 이 라면 Boolean 으로 바 꿀 때 어떤 규칙 으로 바 뀌 었 는 지,자바 와 유사 한 문자열 로 Boolean 으로 바 꾸 는 방법 으로 추측 합 니 다.Boolean.value Of("aaa")//false,이 방법 은 다음 과 같 습 니 다)
在这里插入图片描述
4.567916.8,9,10 의 sql 은 한 그룹 으로 돌아 가 고 데 이 터 를 받 는 경우 한 시간 만 있 으 면 왜 id 의 값 을 취하 여 포장 하 는 지 계속 연구 해 야 한다.
MySQL Boolean 형식의 구덩이
MySQL 에서 Boolean 은 tinyint(1)의 별명 일 뿐 MySQL 에는 진정한 bool 형식 이 없다 는 것 이다.한편,SQLAlchemy 가 SQL 을 생 성 할 때 이 점 을 감지 하지 못 해서 문제 가 발생 했 습 니 다.bool 형식 을 조회 조건 으로 사용 할 때 색인 을 사용 하지 않 아 표를 스 캔 하 는 행위 가 발생 했 습 니 다.

> SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL;
+----------+
| COUNT(*) |
+----------+
| 0        |
+----------+
1 row in set
Time: 0.018s
> SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND message.deleted_at IS NULL;
+----------+
| COUNT(*) |
+----------+
| 0        |
+----------+
1 row in set
Time: 2.162s
첫 번 째 줄 과 두 번 째 줄 의 시간 을 잘 살 펴 보면 두 번 째 줄 은 색인 을 사용 하지 않 은 것 이 분명 하 다.우 리 는 EXPLAIN 의 결 과 를 보면 알 수 있다.

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national = 1 AND message.updated_at > '2020-01-01 00:00:00' AND message.de
        leted_at IS NULL;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1  | SIMPLE | message | ref  | ix_message_updated_at,idx_updated_at_is_national,ix_message_is_national | ix_message_is_national | 1 | const | 1 | Using where |

> EXPLAIN SELECT COUNT(*) FROM message WHERE message.is_national is true AND message.updated_at > '2020-01-01 00:00:00' AND messag
        e.deleted_at IS NULL;
| id | select_type | table   | type | possible_keys | key    | key_len | ref    | rows    | Extra |
| 1  | SIMPLE | message | ALL  | ix_message_updated_at,idx_updated_at_is_national | <null> | <null>  | <null> |         | Using whe
re |
이에 대해 나 는 단지 말 하고 싶 을 뿐이다.너무 함정 에 빠 졌 다!
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기