본문 바로가기

use-the-index-luke

2.7-2 Numeric Strings

use-the-index-luke 저자 Markus Winand

---------------------------------------------

Markus Winand는 SQL에 대한 통찰력을 제공하고 다양한 시스템이 SQL을 지원하는 방법을 modern-sql.com 에서 보여줍니다. 이전에 그는 use-the-index-luke.com 을 만들었는데, 지금도 활발하게 유지되고 있습니다. Markus는 winand.at 를 통해 강사, 연사 및 컨설턴트로 고용될 수 있습니다.

---------------------------------------------

You can upload a Korean translation of use-the-index-luke.com on your blog

Thank you from the bottom of my heart to author Makus Winand for allowing me.

 

These are translations that I use for studying by using a papago (google translate)

The translations may not be correct or there may be a typo.

I'd appreciate it if you could point it out in the comments.

---------------------------------------------

---------------------------------------------

use-the-index-luke.com 의 한글번역본을 블로그에 업로드 해도 된다고

허락해주신 Makus Winand 저자님께 진심으로 감사합니다.

 

이 번역본들은 제가 공부용도로 번역기(papago, google transrate)를 돌려서 

번역한 내용들이라 맞지 않거나, 오타가 있을수 있습니다.

댓글로 지적해주시면 감사하겠습니다.

---------------------------------------------

 

https://use-the-index-luke.com/sql/where-clause/obfuscation/numeric-strings

숫자 문자열

 

숫자 문자열은 텍스트 열에 저장되는 숫자입니다.

매우 나쁜 습관이지만 일관되게 문자열로 취급하는 경우 인덱스를 자동으로 쓸모없게 만들지는 않습니다.

 

----------------------------------------------------------

SELECT ...
  FROM ...
 WHERE
numeric_string = '42'

----------------------------------------------------------

 

물론 문구는 NUMBERIC_STRING 인덱스를 사용할 있습니다. 그러나 숫자를 사용하여 비교하면 데이터베이스는 이상 조건을 access predicate 사용할 없습니다.

----------------------------------------------------------

SELECT ...
  FROM ...
 WHERE
numeric_string = 42

----------------------------------------------------------

누락된 따옴표를 메모합니다. 일부 데이터베이스에서 오류가 발생하더라도 (:PostgreSQL) 대부분의 데이터베이스는 암묵적인 형식 변환만 추가합니다.

----------------------------------------------------------

SELECT ...
  FROM ...
 WHERE
TO_NUMBER(numeric_string) = 42

----------------------------------------------------------

이것은 이전과 같은 문제입니다.

함수 호출로 인해 NUMBERIC_STRING 인덱스를 사용할 없습니다.

솔루션도 이전과 동일합니다.

테이블 열을 변환하지 않고 검색어를 변환합니다.

----------------------------------------------------------

SELECT ...
  FROM ...
 WHERE
numeric_string = TO_CHAR(42)

----------------------------------------------------------

데이터베이스가 자동으로 방법을 수행하지 않는 이유가 궁금할 수도 있겠죠?

문자열을 숫자로 변환하면 항상 명확한 결과가 나오기 때문입니다.

이것은 반대로 사실이 아닙니다. 텍스트 형식의 숫자는 공백, 반점 선행 0 포함할 있습니다.

단일 값은 여러가지 방법으로 작성할 있습니다.:

----------------------------------------------------------

42
042
0042
00042
...

----------------------------------------------------------

 

데이터베이스는 NUMBERIC_STRING 열에 사용된 숫자 형식을 없으므로 다른 방법으로 수행합니다.

데이터베이스는 문자열을 숫자로 변환합니다.

이것은 명백한 변환입니다.

 

 

TO_CHAR 함수는 숫자의 문자열 표현을 하나만 반환합니다. 따라서 위에 나열된 문자열 번째 문자열만 일치합니다. TO_NUMBER 사용하면 모두 일치합니다. , 변형 간에 성능 차이가 있을 뿐만 아니라 의미적 차이도 있습니다!

 

숫자 문자열을 사용하는 것은 일반적으로 문제가 됩니다. 가장 중요한 것은 암시적 변환으로 인해 성능 문제가 발생하고 잘못된 숫자로 인해 변환 오류가 발생할 위험이 있다는 것입니다. where 절의 함수를 사용하지 않는 가장 사소한 쿼리에서도 테이블에 잘못된 숫자가 하나만 저장되어 있으면 변환 오류와 함께 중단이 발생할 있습니다.

----------------------------------------------------------

Tip

숫자 유형을 사용하여 숫자를 저장합니다.

----------------------------------------------------------

 

문제는 반대로 존재하지 않습니다.

 

----------------------------------------------------------

SELECT ...
  FROM ...
 WHERE
numeric_number = '42'

----------------------------------------------------------

 

데이터베이스는 문자열을 일관되게 숫자로 변환합니다. 잠재적으로 인덱스된 열에는 함수가 적용되지 않으므로 일반 인덱스가 작동합니다.

그럼에도 불구하고 잘못된 방법으로 수동 변환을 수행할 있습니다.

----------------------------------------------------------

SELECT ...
  FROM ...
 WHERE
TO_CHAR(numeric_number) = '42'

----------------------------------------------------------

 

'use-the-index-luke' 카테고리의 다른 글

2.7-4 Smart Logic  (0) 2023.09.01
2.7-3 Combining Columns  (0) 2023.08.28
2.7-1 Dates  (0) 2023.08.21
2.7 Obfuscated Conditions  (0) 2023.08.16
2.6-3 Emulating Partial Indexes  (0) 2023.08.11