programing

BIGINT UNSIGNED 값이 범위를 벗어났습니다.

megabox 2023. 8. 2. 08:59
반응형

BIGINT UNSIGNED 값이 범위를 벗어났습니다.

오류가 발생했습니다.

BIGINT UNSIGNED 값이 '(1301980250 -) 범위를 벗어났습니다.mydb.news_articles.date)'

쿼리를 실행할 때

SELECT *, ((1 / log(1301980250 - date)) * 175) as weight FROM news_articles ORDER BY weight;

ORDER BY 조건을 제거하면 오류도 제거됩니다.어떻게 고칠 수 있습니까?

업데이트: 날짜 필드에는 unix 타임스탬프(예: 1298944082)가 포함되어 있습니다.MySQL을 5.0.x에서 5.5.x로 업그레이드한 후 오류가 나타나기 시작했습니다.

도와드릴까요?

저는 최근에 이것과 마주쳤고 서명되지 않은 모든 의미를 서명된 것으로 간단히 캐스팅할 수 있는 가장 합리적인 해결책을 찾았습니다.

 SELECT *, ((1 / log(1301980250 - cast(date as signed)) * 175) as weight FROM news_articles ORDER BY weight

이 문제는 월릭이 제안한 대로 서명되지 않은 정수 오버플로로 인해 발생했습니다.으로 해결할 수 있습니다.

  1. 사용.SELECT *, ((1 / log((date - 1301980250) * -1)) * 175) as weight FROM news_articles ORDER BY weight;(이것은 나에게 효과가 있었습니다)'
  2. my.cnf의 sql_mode 매개 변수를 다음으로 변경하는 중NO_UNSIGNED_SUBTRACTION(확인하지 않음)

데이터의 null로 인해 발생할 수 있습니다.

IFNULL을 사용하여 기본값을 설정합니다(타임스탬프의 경우 0은 기본값이 불량하며 이 경우 WHERE 절에서 날짜와 null 날짜를 제외하는 것이 더 나을 수 있습니다.

SELECT (123456 - IFNULL(date, 0)) AS leVar

2011-04-04 22:10:50 PDT(2011-04-05 05:10:50 utc) 이후의 날짜 값은 식이 음수가 되므로 이 오류가 발생합니다.

log() 함수가 완전히 긍정적인 인수에 대해서만 정의된다는 것은 아무도 언급하지 않았습니다.log()의 내부에서 뺄셈을 사용할 때 주의하십시오.

원래 질문의 경우, 해결의 핵심 요소는 날짜 열에 대한 데이터 유형을 알려주는 것이었습니다.UNSIGNED이면 MySQL이 좋아하지 않을 수 있습니다.

규칙은 MySQL의 산술 알고리즘이 나쁘고, A가 B와 B > A보다 작은 바이트로 코딩되었을 때 다른 A(= do A-B)에서 피연산자 B를 빼는 방법을 알아낼 수 없다는 것입니다.

예: A = 12이고 SMALLINT, B = 13 ASINT, 그러면 MySQL은 A-B가 무엇인지 알 수 없습니다(-1!).

MySQL 콘텐츠를 만들려면 피연산자 A의 코딩 길이를 확장하면 됩니다. 어떻게 해야 할까요?CAST()를 사용하거나 A에 소수점을 곱합니다.

보다시피 MySQL의 산술에서 부호를 처리하는 문제라기보다는 오버플로의 문제입니다.마이크로프로세서나 더 나은 인간은 이런 종류의 연산을 수행하는 데 아무런 문제가 없습니다.

CAST()를 사용하는 것이 피연산자 A에 1(또는 1.0)을 곱하여 암시적 캐스팅을 유발하는 방법입니다.

1.*A - B

아마도 당신은 사용할 수 있습니다.cast

SELECT *, ((1 / log(1301980250 - cast(date AS SIGNED))) * 175) as weight FROM news_articles ORDER BY weight;

결과가 0 미만인 필드를 업데이트하는 중에 이 문제를 발견했습니다.

솔루션:서명되지 않은 필드에서 결과가 0보다 작은 업데이트가 없는지 확인합니다.

언급URL : https://stackoverflow.com/questions/5605085/bigint-unsigned-value-is-out-of-range

반응형