source

MySQL 및 MariaDB - 선행 0이 많은 10진수 값을 나타내는 문자열을 숫자 값으로 캐스팅하면 예기치 않은 결과를 얻을 수 있습니다.

manycodes 2023. 9. 3. 16:24
반응형

MySQL 및 MariaDB - 선행 0이 많은 10진수 값을 나타내는 문자열을 숫자 값으로 캐스팅하면 예기치 않은 결과를 얻을 수 있습니다.

선행 0이 많은 10진수 값을 나타내는 문자열을 숫자 값으로 캐스팅할 때 MySQL 및 MariaDB는 strict 모드를 활성화하면 예기치 않은 결과를 제공합니다.Out of range value오류가 발생하고 엄격 모드가 비활성화된 경우Out of range value경고가 표시되고 결과가 주어진 정밀도로 최대 소수점 값으로 클램프됩니다.예:

SELECT CAST(0000000000000000000000000000000000000000000000000000000000000000000000000000000020.01 AS DECIMAL(15,2)) as val;기브즈9999999999999.99

그러나 실제로 범위를 벗어난 값은 아닙니다. 선행 0이 많은 값일 뿐입니다!왜 이렇게 되는 거지? 인.MS SQL그리고.PostgreSQL이런 일은 일어나지 않습니다.

우리가 이 동작을 조사했을 때, 입력 문자열이 83개의 기호보다 길 때 이 버그는 비활성화된 엄격한 모드로 발생합니다.83한계는 다음과 관련이 있습니다.DECIMAL_MAX_STR_LENGTH에서 일정한.MySQL C소스 코드: 입력 문자열이 해당 상수보다 길면 결과 값이 지정된 정밀도로 최대 10진수 값으로 설정됩니다.이 버그는 다음에 있습니다.MySQL 8.0그리고.MariaDB 10.4.13그리고 아마도 그들의 이전 버전에서도.

예를 들어 MySQL을 사용하는 온라인 금융 서비스의 경우 위험할 수 있습니다.악의적인 사용자는 이 버그를 사용하여 많은 선행 0으로 합계를 입력하여 자신의 계정에서 큰 금액을 얻을 수 있습니다.

우리는 이 버그를 보고했습니다.MySQL개발자들, 그들은 그것이 그렇다고 대답했습니다.

주지의 행동간단히 말해서, 디지털 데이터 유형에는 한계가 있습니다.이 특정 한계는 너무 잘 설명되지 않았습니다. 특히 오버플로를 발생시킬 경우 발생하는 문제의 일부입니다.

그들은 이것을 수정하지 않기로 결정했지만, 그들의 문서에 설명을 추가했습니다.

또한 우리는 보고했습니다.MariaDB그리고 그들은 문제를 해결했습니다.

언급URL : https://stackoverflow.com/questions/62931303/mysql-and-mariadb-casting-a-string-representing-decimal-value-with-many-leadin

반응형