VAR, VARCHAR, TEXT 타입은 non binary string
문자열을 검색할 때 피연산자의 collation을 이용해서 검색(3번째 참고 글에 'If the collation is not case sensitive,' 라는 부분이 있는 것을 보아 모든 collation이 그렇진 않은 것 같다. 현재 내가 사용중인 mariadb 내의 db(schema)에서 default로 설정되어있는 collation인 utf8mb4_general_ci 는 대소문자를 구분하지 않는다.)
BINARY, VARBINARY, BLOB 타입은 binary string
검색할 때 피연산자에 있는 바이트의 숫자 값을 이용
간단하게 생각해서 아스키로 생각해볼 수 있는데 아스키에서 대문자는 65~90, 소문자는 97~122로 서로 다르다.(대소문자 구분이 가능하단 의미)
non binary string이랑 binary string을 비교하면 binary string을 기준으로 비교(대소문자 구분 가능)
대소문자 비교를 위해서 where절에서 값을 binary타입으로 캐스팅
select * from table_name where column_name = binary 'something';
참고한 stackoverflow글에서 Nitesh의 답변에 따르면 column 앞에 binary를 붙이면 index를 사용하지 않아 성능저하가 발생하므로 값에 binary를 붙임
-> column에 binary를 붙여 non binary string이였던 것을 binary로 바꾸게 되면 당연히 원래의 타입과 다르기 때문에 인덱싱에 문제가 되므로 성능 저하가 발생할 수 있다고 생각됨, 그래서 column은 인덱싱을 통해 빠르게 넘어가도록 그대로 두고 비교하려는 literal string을 binary로 만들어준 뒤 비교를 하여 binary를 기준으로 비교되게해서 대소문자 구분이 될 수 있도록 함.
더 찾아보니 마지막 참고 글인 mysql document에 'Be aware that if you apply BINARY, CAST(), or CONVERT() to an indexed column, MySQL may not be able to use the index efficiently.' 이러한 문구가 있다.
비교하려는 column이 index가 적용된 column인 경우에만 조심하면 되는 것 같다.
참고
'개발 > DB' 카테고리의 다른 글
[MariaDB] 외래키 조회 (1) | 2022.07.04 |
---|---|
[MariaDB] 마지막으로 추가한 auto_increment값 가져오기 (0) | 2022.06.27 |
[MariaDB] 컬럼 이름 변경 (0) | 2022.06.27 |
[MariaDB] 테이블 이름 변경 (0) | 2022.06.27 |
[MariaDB] 제약조건 확인 (0) | 2022.05.27 |