복붙노트

PHP PDO : charset, set names?

PHP

PHP PDO : charset, set names?

나는 이전의 나의 일반적인 mysql_ * 연결에서 이것을 가지고 있었다 :

mysql_set_charset("utf8",$link);
mysql_query("SET NAMES 'UTF8'");

PDO에 필요합니까? 그리고 나는 그것을 어디서 가져야합니까?

$connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));

해결법

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

    1.연결 문자열에 다음과 같이 입력합니다.

    연결 문자열에 다음과 같이 입력합니다.

    "mysql:host=$host;dbname=$db;charset=utf8"
    

    그러나 PHP 5.3.6 이전에는 charset 옵션이 무시되었습니다. 이전 버전의 PHP를 실행하는 경우 다음과 같이해야합니다.

    $dbh = new PDO("mysql:$connstr",  $user, $password);
    $dbh->exec("set names utf8");
    
  2. ==============================

    2.PHP 5.3.6 이전에는 charset 옵션이 무시되었습니다. 이전 버전의 PHP를 실행하는 경우 다음과 같이해야합니다.

    PHP 5.3.6 이전에는 charset 옵션이 무시되었습니다. 이전 버전의 PHP를 실행하는 경우 다음과 같이해야합니다.

    <?php
    
        $dbh = new PDO("mysql:$connstr",  $user, $password);
    
        $dbh -> exec("set names utf8");
    
    ?>
    
  3. ==============================

    3.이것은 아마도 가장 우아한 방법 일 것입니다. PDO 생성자 호출에서 오른쪽이지만 (위에서 언급 한 것처럼) 버그가있는 charset 옵션을 사용하지 마십시오.

    이것은 아마도 가장 우아한 방법 일 것입니다. PDO 생성자 호출에서 오른쪽이지만 (위에서 언급 한 것처럼) 버그가있는 charset 옵션을 사용하지 마십시오.

    $connect = new PDO(
      "mysql:host=$host;dbname=$db", 
      $user, 
      $pass, 
      array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
      )
    );
    

    나를 위해 위대한 작품.

  4. ==============================

    4.완성을 위해 실제로 PDO에서 MySQL에 연결할 때 인코딩을 설정하는 세 가지 방법과 PHP 버전에 따라 사용할 수있는 인코딩 방법이 있습니다. 우선 순위는 다음과 같습니다.

    완성을 위해 실제로 PDO에서 MySQL에 연결할 때 인코딩을 설정하는 세 가지 방법과 PHP 버전에 따라 사용할 수있는 인코딩 방법이 있습니다. 우선 순위는 다음과 같습니다.

    이 샘플 코드는이 세 가지를 모두 구현합니다.

    <?php
    
    define('DB_HOST', 'localhost');
    define('DB_SCHEMA', 'test');
    define('DB_USER', 'test');
    define('DB_PASSWORD', 'test');
    define('DB_ENCODING', 'utf8');
    
    
    $dsn = 'mysql:host=' . DB_HOST . ';dbname=' . DB_SCHEMA;
    $options = array(
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    );
    
    if( version_compare(PHP_VERSION, '5.3.6', '<') ){
        if( defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
            $options[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES ' . DB_ENCODING;
        }
    }else{
        $dsn .= ';charset=' . DB_ENCODING;
    }
    
    $conn = @new PDO($dsn, DB_USER, DB_PASSWORD, $options);
    
    if( version_compare(PHP_VERSION, '5.3.6', '<') && !defined('PDO::MYSQL_ATTR_INIT_COMMAND') ){
        $sql = 'SET NAMES ' . DB_ENCODING;
        $conn->exec($sql);
    }
    

    세 가지를 모두하는 것은 아마도 과잉 공격 일 것입니다 (배포하거나 재사용 할 클래스를 작성하지 않는 한).

  5. ==============================

    5.필자는 데이터베이스가 COLLATE utf8_general_ci 또는 사용할 데이터 정렬로 생성되었는지 확인해야한다는 점을 추가하기를 원합니다. 그렇지 않으면 의도하지 않은 데이터 정렬로 끝날 수 있습니다.

    필자는 데이터베이스가 COLLATE utf8_general_ci 또는 사용할 데이터 정렬로 생성되었는지 확인해야한다는 점을 추가하기를 원합니다. 그렇지 않으면 의도하지 않은 데이터 정렬로 끝날 수 있습니다.

    phpmyadmin에서 데이터베이스를 클릭하고 작업을 선택하여 데이터 정렬을 볼 수 있습니다. 데이터베이스와 다른 데이터 정렬로 테이블을 만들면 테이블이 데이터베이스 정렬로 끝나게됩니다.

    따라서 테이블을 만들기 전에 데이터베이스의 데이터 정렬이 올바른지 확인하십시오. 희망이 사람을 몇 시간 롤 저장

  6. ==============================

    6.DSN의 charset 옵션이 실제로 무시되므로 추가 쿼리가 필요하다고 생각합니다. 다른 답변의 댓글에 게시 된 링크를 참조하십시오.

    DSN의 charset 옵션이 실제로 무시되므로 추가 쿼리가 필요하다고 생각합니다. 다른 답변의 댓글에 게시 된 링크를 참조하십시오.

    Drupal 7이 http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7에서 어떻게 작동하는지 살펴 봅니다.

    // Force MySQL to use the UTF-8 character set. Also set the collation, if a
    // certain one has been set; otherwise, MySQL defaults to 'utf8_general_ci'
    // for UTF-8.
    if (!empty($connection_options['collation'])) {
      $this->exec('SET NAMES utf8 COLLATE ' . $connection_options['collation']);
    }
    else {
      $this->exec('SET NAMES utf8');
    }
    
  7. ==============================

    7.이 코드를 테스트하고

    이 코드를 테스트하고

    $db=new PDO('mysql:host=localhost;dbname=cwDB','root','',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $sql="select * from products  ";
    $stmt=$db->prepare($sql);
    $stmt->execute();
    while($result=$stmt->fetch(PDO::FETCH_ASSOC)){                  
        $id=$result['id'];
    }
    
  8. ==============================

    8.

    $conn = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
    
  9. ==============================

    9.

    $con="";
    $MODE="";
    $dbhost = "localhost";
    $dbuser = "root";
    $dbpassword = "";
    $database = "name";
    
    $con = new PDO ( "mysql:host=$dbhost;dbname=$database", "$dbuser", "$dbpassword", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    $con->setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );   
    
  10. ==============================

    10.$ con = new PDO ( "mysql : host = $ dbhost; dbname = $ database; charset = $ encoding", "$ dbuser", "$ dbpassword");

    $ con = new PDO ( "mysql : host = $ dbhost; dbname = $ database; charset = $ encoding", "$ dbuser", "$ dbpassword");

  11. from https://stackoverflow.com/questions/4361459/php-pdo-charset-set-names by cc-by-sa and MIT license