programing

MariaDB(MySQL)는 왜 숫자 리터럴을 문자열로 취급합니까?

telebox 2023. 8. 15. 11:00
반응형

MariaDB(MySQL)는 왜 숫자 리터럴을 문자열로 취급합니까?

오늘 저와 제 동료가 눈치챈 이상한 점이 있습니다.이 작업을 수행할 경우:

select id from table

어디에id이라integer그러면 결과 집합에 ID가 정수로 포함됩니다.모든 것이 좋습니다.그러나 이 작업을 수행할 때:

select 1

그러면 결과 집합에 다음 문자열이 포함됩니다."1"이를 초래한 실제 시나리오는 더 복잡하고 관련이 있었습니다.ifnull()그러나 이것이 문제를 재현하는 가장 간단한 방법입니다.

NodeJS(+Typescript)와 TypeORM을 사용하고 있습니다.저도 PHP에서 비슷한 것을 본 기억이 있지만, 어쨌든 PHP는 종류가 너무 느슨하기 때문에 별로 신경 쓰지 않았습니다.하지만 이번에는 외부 시스템에 JSON으로 데이터를 전달하기 때문에 이제 추가해야 합니다.parseInt()문자열로 입력된 숫자를 실제 숫자로 다시 변환하기 위해.

하지만 - 뭐가?왜 이런 행동을 합니까?

WHERE id = 123      -- fine
WHERE id = "123"    -- also fine; the string is converted to a number
WHERE text = "123"  -- also fine (assuming `text` is VARCHAR or TEXT)
WHERE text = 123    -- inefficient because it converts each text to numeric

많은 API가 값을 쿼리에 "바인딩"합니다.그들 중 많은 사람들이 대상에 상관없이 맹목적으로 인용합니다.위의 내용은 견적이 항상 "괜찮습니다"라고 말합니다.

그래서, 저는 그것이 당신이 질문한 "이유"라고 생각합니다.

그리고 당신이 말한 것처럼, PHP, Perl, 그리고 다른 해석된 언어들이 여기 공간을 어느 정도 지배하고 있습니다.

답을 찾았습니다.

MySQL은 숫자 리터럴을 64비트 정수로 해석합니다.을 할 때CAST(xxx as integer)또한 64비트 정수로 처리합니다(지정할 수 없음).tinyint거기) 등따라서 NodeJS에 도달할 때까지 다음 태그와 함께 제공됩니다.Int64그러나 DB 열을 직접 선택하면 보다 합리적인 방법을 사용할 수 있습니다.Int32뭐 그런 거.

두 번째 부분은 결국 MySQL 클라이언트에 숨겨져 있었습니다.기본값mysqlNPM 패키지는 연결 설정을 확인합니다.bigNumberStrings어느 것이true결석으로사실이라면 64비트 정수를 문자열로 유지합니다.그 이유는 분명합니다 - 자바스크립트의numbertype은 64비트 부동 소수점 값이며 64비트 정수보다 작습니다.그래서 그것을 끈으로 유지하는 것은 모든 경우에 충실함을 유지합니다.

반면에, 만약에.bigNumberStrings=false그런 다음 값을 a로 변환하려고 합니다.number너무 클 경우에만 끈으로 남겨둡니다.그것은 약간 좋지만 항상 그렇게 일관적이지는 않습니다 - 조심해서 다루세요.

어떤 선택을 할지 생각해 봐야겠습니다.

언급URL : https://stackoverflow.com/questions/62158035/why-does-mariadb-mysql-treat-numeric-literals-as-strings

반응형