source

PHP PDO: 문자 집합, 이름 설정?

lovecheck 2022. 11. 18. 21:30
반응형

PHP PDO: 문자 집합, 이름 설정?

이전에 일반 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));

다음과 같은 연결 문자열이 있습니다.

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

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

$dbh = new PDO("mysql:host=$host;dbname=$db",  $user, $password);
$dbh->exec("set names utf8mb4");

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

<?php

    $dbh = new PDO("mysql:$connstr",  $user, $password);

    $dbh -> exec("set names utf8");

?>

이것이 아마도 가장 우아한 방법일 것이다.
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"
  )
);

나한테는 잘 먹힌다.

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

  1. charsetDSN 문자열의 매개 변수
  2. 달려.SET NAMES utf8와 함께PDO::MYSQL_ATTR_INIT_COMMAND접속 옵션
  3. 달려.SET NAMES utf8수동으로

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

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

이 세 가지를 모두 실행하는 것은 과잉일 수 있습니다(배포 또는 재사용을 계획하고 있는 클래스를 작성하지 않는 한).

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

DSN의 charset 옵션은 실제로 무시되기 때문에 추가 쿼리가 필요하다고 생각합니다.다른 답변의 코멘트에 게재되어 있는 링크를 참조해 주세요.

http://api.drupal.org/api/drupal/includes--database--mysql--database.inc/function/DatabaseConnection_mysql%3A%3A__construct/7에서 Drupal 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');
}
$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 );   

데이터베이스가 COLATE utf8_general_ci 또는 사용할 조합으로 작성되었는지 확인해야 합니다.그렇지 않으면 의도하지 않은 다른 조합이 발생할 수 있습니다.

phpmyadmin에서는 데이터베이스를 클릭하여 조작을 선택하면 대조 결과를 볼 수 있습니다.데이터베이스 이외의 다른 대조로 테이블을 작성하려고 하면 테이블은 데이터베이스 대조로 끝납니다.

따라서 테이블을 작성하기 전에 데이터베이스 조회가 올바른지 확인하십시오.이렇게 하면 누군가가 몇 시간을 절약할 수 있을 것 같아 lol

이 코드를 테스트하고

$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'];
}

저 같은 경우에는 다음 행을 추가해야 했습니다.

$conn->exec("set names utf8"); //Support utf8

외관:

$conn = new PDO("mysql:host=$servername;dbname=$db", $username, $password);
$conn->exec("set names utf8"); //Support utf8

언급URL : https://stackoverflow.com/questions/4361459/php-pdo-charset-set-names

반응형