복붙노트

PDO를 사용하여 MySQL에서 숫자 형을 얻는 방법?

PHP

PDO를 사용하여 MySQL에서 숫자 형을 얻는 방법?

PDOS와 MySQL을 사용하고 있는데, 어떤 이유로 int 타입의 데이터베이스에서 값을 가져올 때, PDOStatement는 숫자 타입의 값이 아닌 숫자의 문자열 표현을 반환합니다. 어떻게 이런 일이 일어나지 않도록합니까?

PDO 클래스의 속성 인 PDO :: ATTR_STRINGIFY_FETCHES가이 문제를 처리 할 것으로 보이지만 수정할 때 속성이 MySQL 드라이버에 유효하지 않다는 오류가 발생합니다.

데이터베이스를 참조 할 때 숫자 대신 문자열을 얻는 것이 일반적입니까?

해결법

  1. ==============================

    1.나는 "숫자"를 PHP 5.2에서 할 수 있다고 생각하지 않는다 :-(

    나는 "숫자"를 PHP 5.2에서 할 수 있다고 생각하지 않는다 :-(

    PHP 5.3에서는 mysqlnd (MySQL 네이티브 드라이버) 드라이버를 새로 사용할 때 (PHP> = 5.3의 새로운 기능) 드라이버를 사용할 때 올바르게 기억 될 수 있습니다.

    글쎄, 내 책갈피를 통해 더 많은 파고 후 나는 mysqlnd에 대해이 문서를 발견 : PDO_MYSQLND : PHP 5.3에서 PDO_MYSQL의 새로운 기능

    그것은 이것을 말하고 있습니다 (인용) :

    하지만 이것은 PHP 5.3 (PHP 5.3의 버전이 mysqlnd (그리고 오래된 libmysql이 아닌)으로 컴파일 된 경우)이며, 준비된 명령문의 경우 일뿐입니다 :-(

    죄송합니다...

    솔루션은 PHP 측에서 매핑 시스템 (ORM과 유사 - Doctrine 참조, ORM의 예와 마찬가지로 : 사용자가 요청한 것인지 모르겠 음)을 결과로 변환하는 것입니다 DB에서 PHP 데이터 유형으로 변환하는 중 ...

    그리고 네, === 및 == 같은 연산자를 사용하려는 경우 이것은 형체에 민감합니다.

  2. ==============================

    2.마지막 질문에 대답하기 위해 "예,"불행히도 숫자를 문자열로받는 것이 정상입니다. Pascal에 의해 인용 된 매뉴얼에서 말하는 바와 같이, mysqlnd (PHP 5.3)는 PDO로부터 준비된 문장 에뮬레이션을 끄면 준비된 문장으로부터 원래의 데이터 유형을 반환 할 것이다.

    마지막 질문에 대답하기 위해 "예,"불행히도 숫자를 문자열로받는 것이 정상입니다. Pascal에 의해 인용 된 매뉴얼에서 말하는 바와 같이, mysqlnd (PHP 5.3)는 PDO로부터 준비된 문장 에뮬레이션을 끄면 준비된 문장으로부터 원래의 데이터 유형을 반환 할 것이다.

    new PDO($dsn, $user, $pass, array(
        PDO::ATTR_EMULATE_PREPARES => false
    ))
    

    PDO :: ATTR_STRINGIFY_FETCHES는 MySQL과 관련이 없습니다.

    밝은면을 보면 어쨌든 준비된 문을 사용하는 것이 좋습니다. 따라서 ...)

  3. ==============================

    3.파스칼의 대답은 정확합니다. 나는 그것이 모든 일을하는 데 약간의 어려움을 겪었다. 여기 당신이해야 할 일이 있습니다.

    파스칼의 대답은 정확합니다. 나는 그것이 모든 일을하는 데 약간의 어려움을 겪었다. 여기 당신이해야 할 일이 있습니다.

    먼저, mysqlnd를 설치하고 활성화했는지 확인하십시오. php --info를보십시오. pdo_mysql 섹션에서 다음과 같이 표시됩니다.

    pdo_mysql
    
    PDO Driver for MySQL => enabled
    Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321
    

    클라이언트 API 버전에서 mysqlnd를 보는 대신 다음과 같은 행을 볼 수 있습니다.

    Client API version => 5.5.29
    

    ... mysqlnd를 설치하고 실행하지 않아도됩니다. 먼저 돌보아주세요.

    둘째, PDO는 모든 MySQL 연결에 기본적으로 에뮬레이트 된 준비 문을 사용합니다. 우스꽝 스럽지만 거기에있다. 또한 실제 준비 문을 사용하는 경우에만 네이티브 데이터 유형을 얻을 수 있습니다 (링크 된 블로그 게시물에 "서버 측 준비 문"이라고 함, 여기에 있음). 따라서 다음과 같이 PDO :: ATTR_EMULATE_PREPARES를 false로 설정해야합니다.

    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    

    마지막으로, PDO :: ATTR_STRINGIFY_FETCHES를 true로 설정하지 않았는지 확인하십시오.

    $pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
    
  4. ==============================

    4.mysqlnd를 설치했을 수도 있지만 일반적인 PDO 확장 (pdo_mysql)에서 사용할 준비가되었다는 의미는 아닙니다. 공유 호스팅의 경우가 더 많으므로 nd_pdo_mysql 확장을 활성화하고 다른 옵션을 비활성화해야합니다 pdo_mysql 확장을 사용하면 충돌이 발생할 수 있습니다.

    mysqlnd를 설치했을 수도 있지만 일반적인 PDO 확장 (pdo_mysql)에서 사용할 준비가되었다는 의미는 아닙니다. 공유 호스팅의 경우가 더 많으므로 nd_pdo_mysql 확장을 활성화하고 다른 옵션을 비활성화해야합니다 pdo_mysql 확장을 사용하면 충돌이 발생할 수 있습니다.

    @screenshot

    나는이 (중복) 질문을 발견하고, 여기에 내 생각을 게시하기로 결정했다.

  5. from https://stackoverflow.com/questions/1197005/how-to-get-numeric-types-from-mysql-using-pdo by cc-by-sa and MIT license