developer tip

PDO를 사용하여 MySQL에서 숫자 유형을 얻는 방법은 무엇입니까?

copycodes 2020. 11. 30. 17:57
반응형

PDO를 사용하여 MySQL에서 숫자 유형을 얻는 방법은 무엇입니까?


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

PDO 클래스의 속성이 있음을 발견했습니다.이 속성을 PDO::ATTR_STRINGIFY_FETCHES처리해야하지만 수정하려고 할 때 속성이 MySQL 드라이버에 유효하지 않다는 오류가 발생합니다.

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


PHP 5.2에서 "숫자"를 가질 수 없다고 생각합니다. :-(

PHP 5.3에서는 새로운 (PHP> = 5.3에서와 같이 새로운) mysql nd (MySQL Native Driver) 드라이버를 사용할 때 올바르게 기억하면 가능합니다 .

글쎄, 내 북마크를 더 자세히 살펴본 후 mysqlnd에 대한 기사를 찾았습니다. PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

(인용문) :

PDO 용 mysqlnd 사용의 장점

mysqlnd는 서버 측 준비된 문을 사용할 때 네이티브 데이터 유형을 반환합니다. 예를 들어 INT 열은 문자열이 아닌 정수 변수로 반환됩니다. 이는 내부적으로 더 적은 데이터 변환을 의미합니다.

그러나 이것은 PHP 5.3 전용이며 (PHP 5.3의 버전이 mysqlnd ( 오래된 libmysql이 아님 ) 로 컴파일 된 경우), 준비된 명령문의 경우에만 해당되는 것 같습니다.

죄송합니다...

해결책이 가지고하는 것은 PHP 측에 매핑 시스템 (AN ORM 등 - 볼 교리 , 그냥 ORM의 예로서 : 몰라요 당신이 요구하는지 않는 경우) 결과를 변환 DB에서 PHP 데이터 유형으로 ...

그리고 예, 유형을 구분하는 ===and와 같은 연산자를 사용하려는 경우에는 좋지 !==않습니다.


마지막 질문에 먼저 대답하려면 "예"입니다. 불행히도 숫자를 문자열로받는 것이 정상입니다. Pascal이 인용 한 매뉴얼에 따르면 mysqlnd (PHP 5.3)는 PDO에서 준비된 명령문 에뮬레이션을 끄면 준비된 명령문에서 네이티브 데이터 유형을 반환합니다.

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

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

밝은면을 보면 어쨌든 준비된 문장을 사용하는 것이 좋은 습관 이니까 ...;)


파스칼의 대답 이 맞습니다. 나는 그것이 모든 것을 작동시키는 데 약간의 어려움을 겪었습니다. 여기에해야 할 일이 있습니다.

먼저 mysqlnd를 설치하고 활성화했는지 확인하십시오. 보세요 php --info. pdo_mysql 섹션에서 다음과 같아야합니다.

pdo_mysql

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

mysqlndClient API 버전 대신에 다음 과 같은 줄이 표시되면 ...

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);

mysqlnd설치 했을 수도 있지만 일반 PDO확장 프로그램 (pdo_mysql)에서 사용할 준비가되었음을 의미하지는 않습니다 . 공유 호스팅에서 더 자주 발생하므로 nd_pdo_mysql확장 프로그램 을 활성화하고 다른 확장 프로그램을 비활성화 pdo_mysql해야합니다. 충돌.

@ 스크린 샷

여기에 이미지 설명 입력

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

참고 URL : https://stackoverflow.com/questions/1197005/how-to-get-numeric-types-from-mysql-using-pdo

반응형