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 |