10진수 문자열 및 Money 값 형식 지정(PDO_SQLSRV 드라이버)

PHP 드라이버 다운로드

정확도를 유지하기 위해 decimal 또는 numeric 형식은 항상 정확한 전체 자릿수 및 소수 자릿수가 포함된 문자열로 페치됩니다. 값이 1보다 작은 경우 앞에 오는 0이 누락됩니다. Money 및 smallmoney 필드도 마찬가지입니다. 이들 필드는 고정 소수 자릿수가 4인 10진수 필드이기 때문입니다.

누락된 경우 앞에 오는 0 추가

버전 5.6.0부터 사용자가 연결 또는 문 특성 PDO::SQLSRV_ATTR_FORMAT_DECIMALS에서 10진수 문자열의 서식을 지정할 수 있습니다. 이 특성은 부울 값(true 또는 false)을 예상하며 가져온 결과에서 소수 또는 숫자 값의 형식에만 영향을 줍니다. 즉, 이 특성은 삽입 또는 업데이트와 같은 다른 작업에는 영향을 주지 않습니다.

기본적으로 PDO::SQLSRV_ATTR_FORMAT_DECIMALSfalse입니다. true로 설정하면 1보다 작은 10진수 값에 대해 선행 0이 10진수 문자열에 추가됩니다.

소수 자릿수 구성

사용자는 PDO::SQLSRV_ATTR_FORMAT_DECIMALS가 활성화된 상태에서 다른 연결 또는 문 특성인 PDO::SQLSRV_ATTR_DECIMAL_PLACES를 통해 Money와 smallmoney 데이터를 표시할 때 소수점 이하 자릿수를 구성할 수 있습니다. 이 값은 [0, 4] 범위의 정수 값을 허용하고, 표시될 때 반올림이 발생할 수 있습니다. 그러나 기본 Money 데이터는 동일하게 유지됩니다.

문 특성은 항상 해당하는 연결 설정을 재정의합니다. PDO::SQLSRV_ATTR_DECIMAL_PLACES 옵션은 Money 데이터에만 영향을 미치며, PDO::SQLSRV_ATTR_FORMAT_DECIMALS는 true로 설정해야 합니다. 그렇지 않으면 PDO::SQLSRV_ATTR_DECIMAL_PLACES 설정에 관계없이 서식이 해제됩니다.

참고 항목

Money 또는 smallmoney 필드의 스케일은 4이므로 PDO::SQLSRV_ATTR_DECIMAL_PLACES를 음수 또는 4보다 큰 값으로 설정하면 무시됩니다. 형식이 지정된 Money 데이터는 계산에 대한 입력으로 사용하지 않는 것이 좋습니다.

연결 특성을 설정하려면

  • 연결 지점에 특성을 설정합니다.

    $attrs = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => true,
                   PDO::SQLSRV_ATTR_DECIMAL_PLACES => 2);
    
    $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password, $attrs);
    
  • 연결 후 특성 설정:

    $conn = new PDO("sqlsrv:Server = myServer; Database = myDB", $username, $password);
    $conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
    $conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);
    

예시 - Money 데이터 형식 지정

다음 예시에서는 PDOStatement::bindColumn을 사용하여 Money 데이터를 가져오는 방법을 보여줍니다.

<?php
$database = "myDB";
$server = "(local)";
$conn = new PDO( "sqlsrv:server=$server; Database = $database", "", "");
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);

$numDigits = 3;
$query = "SELECT smallmoney1 FROM aTable";
$options = array(PDO::SQLSRV_ATTR_DECIMAL_PLACES => $numDigits);
$stmt = $conn->prepare($query, $options);
$stmt->execute();

$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);
echo $field;    // expect a number string with 3 decimal places

unset($stmt);
unset($conn);
?>

예시 - 연결 특성 재정의

다음 예시에서는 연결 특성을 재정의하는 방법을 보여줍니다.

<?php
$database = 'myDatabase';
$server = 'myServer';
$username = 'myuser';
$password = 'mypassword'

$conn = new PDO("sqlsrv:server=$server; Database = $database", $username, $password);
$conn->setAttribute(PDO::SQLSRV_ATTR_FORMAT_DECIMALS, true);
$conn->setAttribute(PDO::SQLSRV_ATTR_DECIMAL_PLACES, 2);

$query = 'SELECT smallmoney1 FROM testTable1';
$options = array(PDO::SQLSRV_ATTR_FORMAT_DECIMALS => false);
$stmt = $conn->prepare($query, $options);
$stmt->execute();

$stmt->bindColumn('smallmoney1', $field);
$result = $stmt->fetch(PDO::FETCH_BOUND);  
echo $field;   // expect a number string showing the original scale -- 4 decimal places

unset($stmt);
unset($conn);
?>

참고 항목

10진수 문자열 및 Money 값 형식 지정(SQLSRV 드라이버)

데이터 검색