programing

MySQL에서 정수 및 숫자 열을 PHP에서 정수 및 숫자로 반환하려면 어떻게 해야 합니까?

shortcode 2022. 9. 7. 00:00
반응형

MySQL에서 정수 및 숫자 열을 PHP에서 정수 및 숫자로 반환하려면 어떻게 해야 합니까?

문제는 DB 쿼리가 정수 열에 대해 PHP의 정수 데이터 유형을 반환해야 한다는 것입니다.대신 쿼리는 모든 열을 문자열 유형으로 반환합니다.

"PDO::ATR_STRINGIFY_FETCHES"를 입력합니다.

내가 본 답변:

  • 될 수 없다.
    • 아니요, Mac OS X가 설치된 PHP/MySQL에서 작동합니다.
  • 코드에 있는 모든 값을 입력하세요.
    • 아니요, 안 할 거예요.
  • 걱정하지 마세요, PHP는 느슨하게 입력되어 있습니다.
    • 데이터는 JSON으로 출력되어 다른 많은 서비스에서 사용되고 있으며 일부 서비스에서는 올바른 형식의 데이터가 필요합니다.

조사 결과, 이것은 드라이버의 실장 문제인 것을 알 수 있었습니다.

많은 소스에서는 MySQL 네이티브 드라이버가 숫자 유형 반환을 지원하지 않는다고 주장합니다.이는 Mac OS X에서 작동하기 때문에 사실이 아닌 것 같습니다. "Linux의 MySQL 네이티브 드라이버는 이 기능을 지원하지 않습니다."라고 말하는 것이 아니라면 말입니다.

이것은 Mac OS X에 설치한 드라이버/환경에 특별한 점이 있다는 것을 의미합니다. 수정을 적용하기 위해 차이를 식별하려고 노력했지만, 이러한 사항을 확인하는 방법에 대한 지식으로는 한계가 있습니다.

차이점은 다음과 같습니다.

  • OS X의 PHP는 Home Brew를 통해 컴파일 및 설치되었습니다.
  • Ubuntu의 PHP는 "apt-get install php5-dev"를 통해 설치되었습니다.
  • OS X의 PHP가 OS X에서도 실행되고 있는 MySQL 서버에 접속하고 있습니다.
    • 서버 버전: 5.1.71-log 소스 배포
  • Ubuntu의 PHP가 Rackspace 클라우드 데이터베이스에 연결 중입니다.
    • 서버 버전: 5.1.66-0+squeeze1(데비안)

Ubuntu 환경

  • 버전: 10.04.1

  • PHP 5.4.21-1+debphp.org~cli+1 (빌드:2013년 10월 21일 08:14:37)

  • php - i

    pdo_interface(pdo_module(패킷)

    MySQL = > 지원 클라이언트 API 버전 = > 5.1.72용 PDO 드라이버

Mac OS X 환경

  • 10.7.5

  • PHP 5.4.16 (cli) (구축:2013년 8월 22일 09:05:58)

  • php - i

    pdo_interface(pdo_module(패킷)

    MySQL = > 지원 클라이언트 API 버전 = > mysqlnd 5.0.10 - 20111026 - $Id : e707c415db32080b3752b232487a435ee0372157$

PDO 플래그 사용

PDO::ATTR_CASE => PDO::CASE_NATURAL,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,
PDO::ATTR_STRINGIFY_FETCHES => false,
PDO::ATTR_EMULATE_PREPARES => false,

해결책은 php용 mysqlnd 드라이버를 사용하고 있는지 확인하는 것입니다.

mysqlnd를 사용하지 않는 것을 어떻게 알 수 있습니까?

" " 를 할 php -i"nd"에 대한 언급은 없습니다.pdo_mysql션음음 음 음 음 、 음 음 음 、 음 음 음 、

pdo_mysql

PDO Driver for MySQL => enabled Client API version => 5.1.72

어떻게 설치합니까?

P 가이드에서는 L/A/M/P를 권장하고 있습니다.apt-get install php5-mysqlMySQL용 네이티브 드라이버는 다른 패키지로 설치됩니다. php5-mysqlndppa:ondrej/php5-oldstable에서 사용할 수 있다는 것을 알았습니다.

Ubuntu에서 새 드라이버로 전환하려면:

  • 이치노
    apt-get remove php5-mysql
  • 새로운 드라이버를 인스톨 합니다.
    apt-get install php5-mysqlnd
  • apache2 를 합니다.
    service apache2 restart

드라이버가 사용되고 있는지 확인하려면 어떻게 해야 합니까?

, 이제php -i는 'nd'에 '를 명시적으로합니다.pdo_mysql★★★★

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.10 - 20111026 - $Id:      e707c415db32080b3752b232487a435ee0372157 $

PDO 설정

확인하세요.PDO::ATTR_EMULATE_PREPARESfalse (디폴트 설정을 합니다).
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

확인하세요.PDO::ATTR_STRINGIFY_FETCHESfalse (디폴트 설정을 합니다).
$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);

반환된 값

  • 부동소수점 유형(FLOAT, DOUBLE)은 PHP 부동소수점으로 반환됩니다.
  • 정수형(INTEGER, INT, SMARINT, TINYINT, MEDIOMINT, BIGINT ))은 PHP 정수로 반환됩니다.
  • 고정 소수점 유형(DECIMAL, NUMERIC)은 문자열로 반환됩니다.

값이 64비트 서명 int(9223372036854775807)보다 큰 BIGINT는 문자열로 반환됩니다(32비트 시스템에서는 32비트).

    object(stdClass)[915]
      public 'integer_col' => int 1
      public 'double_col' => float 1.55
      public 'float_col' => float 1.5
      public 'decimal_col' => string '1.20' (length=4)
      public 'bigint_col' => string '18446744073709551615' (length=20)

이 답변은 유효하며, 구글에서 이 질문에 대해 가장 인기 있는 답변인 것 같습니다.문제는 애플리케이션을 여러 환경에 도입해야 하고 올바른 드라이버를 설치할 수 있는 능력이 항상 있는 것은 아니며, 문자열이 아닌 소수점이어야 한다는 것입니다.그래서 JSON 인코딩 전에 대소문자를 입력하는 루틴을 만들었습니다.궤도에서 핵을 주입하는 것과 비슷해

먼저 "SHOW columns from"을 사용하여 테이블에서 열을 가져옵니다.mysql 쿼리 "SHOW COLUMNS FROM table like 'colmunname'":질문

$query = 'SHOW COLUMNS FROM ' . $table; //run with mysqli or PDO 

그런 다음 반복하기 쉽도록 열 이름으로 인덱싱된 배열로 유형을 가져옵니다.show columns의 결과 세트가 $columns_from_table이라는 변수에 있다고 가정합니다.http://php.net/manual/en/function.array-column.php

$column_types = array_column( $columns_from_table, 'Type', 'Field');

다음으로 varchar(32) 또는 decimal(14,6)과 같은 타입에서 parentematic을 삭제합니다.

foreach( $column_types as $col=>$type )
{
    $len = strpos( $type, '(' );
    if( $len !== false )
    {
        $column_types[ $col ] = substr( $type, 0, $len );
    }
}

이제 열 이름을 인덱스로, 형식 유형을 값으로 하는 연결된 배열이 있습니다. 예를 들어 다음과 같습니다.

Array
(
    [id] => int
    [name] => varchar
    [balance] => decimal
    ...
)

이제 테이블에서 선택을 수행할 때 결과를 반복하여 값을 적절한 유형으로 지정할 수 있습니다.

foreach( $results as $index=>$row )
{
    foreach( $row as $col=>$value )
    {
        switch( $column_types[$col] )
        {
            case 'decimal':
            case 'numeric':
            case 'float':
            case 'double':

                $row[ $col ] = (float)$value;
                break;

            case 'integer':
            case 'int':
            case 'bigint':
            case 'mediumint':
            case 'tinyint':
            case 'smallint':

                $row[ $col ] = (int)$value;
                break;
        }

    }
    $results[ $index ] = $row;
}

스위치 문은 필요에 따라 쉽게 변경할 수 있으며 날짜 함수 등을 포함할 수 있습니다.예를 들어, 서드파티가 통화 가치를 소수점으로서 데이터베이스에 밀어넣고 있습니다만, 그 데이터를 취득해 JSON으로 반환할 필요가 있는 경우는, 문자열이 아니고 숫자여야 합니다.

PHP 7, 7.2 및 JQuery 2, 3에서 테스트 완료.

php-8.1.0RC1/은 ELEMATE_PREPARES의 네이티브 타입인 https://github.com/php/php-src/tree/c18b1aea289e8ed6edb3f6e6a135018976a034c6에서도 사용할 수 있으므로 앞으로는 생략할 수 있습니다.PDO::ATTR_EMULATE_PREPARES => false 옵션.

언급URL : https://stackoverflow.com/questions/20079320/how-do-i-return-integer-and-numeric-columns-from-mysql-as-integers-and-numerics

반응형