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
'source' 카테고리의 다른 글
git: 한 레포에서 커밋에 의해 도입된 변경 사항을 다른 레포에 적용합니다. (0) | 2023.09.03 |
---|---|
Azure 파이프라인:치명적입니다. 'https://github.com '에 대한 사용자 이름을 읽을 수 없습니다. 터미널 프롬프트가 비활성화되었습니다. (0) | 2023.09.03 |
S3를 통해 Amazon CloudFront에서 gziped CSS 및 JavaScript 제공 (0) | 2023.09.03 |
USB 장치의 데이터베이스 (0) | 2023.09.03 |
사용자의 로케일 형식 및 시간 오프셋으로 날짜/시간 표시 (0) | 2023.09.03 |