포스트

2021-09-01-TIL

SQL

SQL 쿼리 순서

SQL은 작성하는 순서와 논리적으로 처리되는 순서가 다르다. SQL Server 문서는 SELECT 문의 논리 처리 순서를 FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> TOP으로 정리한다. 이 순서는 어느 절에서 무엇을 참조할 수 있는지를 결정한다. 예를 들어 SELECT에서 붙인 별칭은 그보다 앞서 처리되는 WHERE에서는 쓸 수 없고, 뒤에 오는 ORDER BY에서는 쓸 수 있다. 실제 실행 순서는 옵티마이저가 정하므로, 이 목록은 실행 계획이 아니라 이름이 보이는 범위를 설명하는 규칙으로 읽으면 된다. 제품마다 세부가 다를 수 있다(MySQL은 GROUP BY나 HAVING에서 별칭을 허용한다).

  • https://bicloud.tistory.com/20

MySQL

Collation

Collation은 문자열을 비교하고 정렬하는 규칙이다. 같은 문자셋이라도 collation에 따라 'a' = 'A'가 참이 되기도 하고 거짓이 되기도 한다. 이름 끝의 접미사가 규칙을 알려 준다. _ci는 대소문자 무시, _ai는 악센트 무시, _bin은 바이트 값 그대로 비교한다.

utf8mb4에는 collation이 여러 개 있다. utf8mb4_general_ci는 오래된 규칙으로 문자를 하나씩만 비교해서 빠르지만 덜 정확하다. utf8mb4_unicode_ci는 UCA 4.0.0 기반으로 독일어 ß = ss 같은 확장 비교를 지원한다. utf8mb4_0900_ai_ci는 UCA 9.0.0 기반이고, 뒤쪽 공백을 다른 문자처럼 취급하는 NO PAD 속성을 가진다.

컬럼 단위로 문자셋과 collation을 바꿀 때는 ALTER TABLE ... MODIFY에 CHARACTER SET과 COLLATE를 함께 적는다.

1
2
3
4
ALTER TABLE t1 MODIFY
    col1 VARCHAR(50)
      CHARACTER SET utf8mb4
      COLLATE utf8mb4_unicode_ci;

둘 다 생략하면 컬럼은 테이블 기본값을 따른다. 그래서 테이블 기본값과 컬럼 설정이 다른 상태로 조인하면 collation 불일치 에러를 만날 수 있다.

  • https://zetawiki.com/wiki/MySQL_%ED%85%8C%EC%9D%B4%EB%B8%94collation%EB%B3%80%EA%B2%BD
  • https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html
  • https://dev.mysql.com/doc/refman/8.0/en/charset-column.html

Encoding

MySQL의 utf8은 utf8mb3의 별칭이고, 문자당 최대 3바이트만 쓴다. 그래서 이모지 같은 보충 문자(4바이트)를 저장할 수 없다. 4바이트 문자까지 담으려면 utf8mb4를 써야 한다. 기본 다국어 평면(BMP)의 문자는 두 문자셋에서 인코딩과 길이가 같으므로, utf8mb3 컬럼을 utf8mb4로 바꿀 때 기존 데이터가 깨질 걱정은 없다.

  • https://m.blog.naver.com/xhdlrkd/221762674910

MyBatis

How to wrap multiple select queries into one query

MyBatis는 저장 프로시저처럼 한 번의 호출로 결과 집합을 여러 개 돌려주는 경우를 매핑할 수 있다. <select>의 resultSets 속성에 결과 집합 이름을 쉼표로 나열하고, <association>이나 <collection>의 resultSet 속성으로 어느 결과 집합을 쓸지 지정한다. 부모와 자식 행은 column과 foreignColumn으로 연결한다. 이 기능은 데이터베이스가 여러 결과 집합 반환을 지원할 때만 쓸 수 있다.

  • https://github.com/mybatis/mybatis-3/issues/274

RestTemplate

HTTP get with headers using RestTemplate

RestTemplate의 getForObject, getForEntity는 URL과 응답 타입, URI 변수만 받아서 요청 헤더를 넣을 자리가 없다. 헤더가 필요하면 exchange를 쓰고, 헤더를 HttpEntity에 담아 넘긴다.

1
2
3
4
5
6
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", "Bearer " + token);
HttpEntity<Void> request = new HttpEntity<>(headers);

ResponseEntity<String> response =
    restTemplate.exchange(url, HttpMethod.GET, request, String.class);
  • https://stackoverflow.com/questions/16781680/http-get-with-headers-using-resttemplate
  • https://attacomsian.com/blog/spring-boot-resttemplate-get-request-parameters-headers
참고한 자료외부 출처 7

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다