다음을 통해 공유


변환 규칙

이 섹션의 규칙은 숫자 리터럴과 관련된 변환에 적용됩니다. 이러한 규칙의 목적을 위해 다음 용어가 정의됩니다.

  • 저장소 할당: 데이터베이스의 테이블 열로 데이터를 보낼 때 이는 SQLExecute, SQLExecDirectSQLSetPos를 호출하는 동안 발생합니다. 저장소 할당 중에 "대상"은 데이터베이스 열을 참조하고 "원본"은 애플리케이션 버퍼의 데이터를 참조합니다.

  • 검색 할당: 데이터베이스에서 애플리케이션 버퍼로 데이터를 검색하는 경우 이는 SQLFetch, SQLGetData, SQLFetchScrollSQLSetPos를 호출하는 동안 발생합니다. 검색 할당 중에 "대상"은 애플리케이션 버퍼를 참조하고 "원본"은 데이터베이스 열을 참조합니다.

  • CS: 문자 원본의 값입니다.

  • NT: 숫자 대상의 값입니다.

  • NS: 숫자 원본의 값입니다.

  • CT: 문자 대상의 값입니다.

  • 정확한 숫자 리터럴의 정밀도: 포함된 자릿수입니다.

  • 정확한 숫자 리터럴의 배율: 표현되거나 암시된 기간의 오른쪽에 있는 숫자 수입니다.

  • 대략적인 숫자 리터럴의 정밀도: 해당 가수의 정밀도입니다.

숫자 대상에 문자 원본

다음은 CS(문자 원본)에서 NT(숫자 대상)로 변환하는 규칙입니다.

  1. CS에서 선행 또는 후행 공백을 제거하여 CS를 가져온 값으로 바꿉니다. CS가 유효한 숫자 리터럴이 아니면 SQLSTATE 22018(캐스트 사양에 잘못된 문자 값)이 반환됩니다.

  2. 10진수 지점 앞의 선행 0을 제거하거나 소수점 뒤의 후행 0 또는 둘 다를 제거하여 CS를 가져온 값으로 바꿉니다.

  3. CS를 NT로 변환합니다. 변환으로 인해 유효 자릿수가 손실되면 SQLSTATE 22003(숫자 값이 범위를 벗어났습니다)이 반환됩니다. 변환으로 인해 중요하지 않은 숫자가 손실되면 SQLSTATE 01S07(소수 잘림)이 반환됩니다.

숫자 원본에서 문자 대상으로

다음은 NS(숫자 원본)에서 CT(문자 대상)로 변환하는 규칙입니다.

  1. LT가 CT 문자의 길이가 되도록 합니다. 검색 할당의 경우 LT는 이 문자 집합에 대한 null 종료 문자의 바이트 수를 뺀 문자의 버퍼 길이와 같습니다.

  2. 경우:

    • NS가 정확한 숫자 형식인 경우 YP가 정확한 숫자 리터럴정의를 따르는 가장 짧은 문자열과 같게 하여 YP의 소수 자릿수가 NS의 소수 자릿수와 같고 YP의 해석된 값이 NS의 절대값이 되도록 합니다.

    • NS가 대략적인 숫자 형식인 경우 다음과 같이 YP를 문자 문자열로 만듭니다.

      경우:

      NS가 0과 같으면 YP는 0입니다.

      YSN이 정확한 숫자 리터럴 의 정의를 준수하고 해석된 값이 NS의 절대값인 가장 짧은 문자열이 되도록 합니다. YSN의 길이가 NS 데이터 형식의 (전체 자릿수 + 1)보다 작으면 YP가 YSN과 같게 합니다.

      그렇지 않은 경우 YP는 해석된 값이 NS의 절대값이고 해당 가수가 '0'이 아닌 한 자리로 구성된 후 마침표부호 없는 정로 구성된 근사 숫자 리터럴정의를 따르는 가장 짧은 문자열입니다.

  3. 경우:

    • NS가 0보다 작은 경우 Y를 다음의 결과로 허용합니다.

      '-' || Yp

      여기서 '||'은 문자열 연결 연산자입니다.

      그렇지 않으면 Y가 YP와 같게 합니다.

  4. LY가 Y 문자의 길이가 되도록 합니다.

  5. 경우:

    • LY가 LT와 같으면 CT가 Y로 설정됩니다.

    • LY가 LT보다 작은 경우 CT는 적절한 수의 공백으로 오른쪽에 확장된 Y로 설정됩니다.

      그렇지 않으면(LY > LT) Y의 첫 번째 LT 문자를 CT에 복사합니다.

      경우:

      저장소 할당인 경우 SQLSTATE 22001(문자열 데이터, 오른쪽 잘림) 오류를 반환합니다.

      검색 할당인 경우 경고 SQLSTATE 01004(문자열 데이터, 오른쪽 잘림)를 반환합니다. 복사로 인해 소수 자릿수가 손실되는 경우(후행 0이 아닌) 다음 중 하나가 발생하는지 여부를 드라이버로 정의합니다.

      (1) 드라이버는 Y의 문자열을 적절한 배율(0일 수도 있음)로 잘라내고 결과를 CT에 씁니다.

      (2) 드라이버는 Y의 문자열을 적절한 배율(0일 수도 있음)로 반올림하고 결과를 CT에 씁니다.

      (3) 드라이버는 잘리거나 반올림하지 않지만 Y의 첫 번째 LT 문자를 CT에 복사합니다.