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 버전에 따라 다릅니다.우선 순서는 다음과 같습니다.
charset
DSN 문자열의 매개 변수- 달려.
SET NAMES utf8
와 함께PDO::MYSQL_ATTR_INIT_COMMAND
접속 옵션 - 달려.
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
'source' 카테고리의 다른 글
HTML php 스크립트를 통해 mysql 데이터베이스에 연결할 수 없습니다. (0) | 2022.11.18 |
---|---|
Uncourched ReferenceError: $가 정의되지 않았습니까? (0) | 2022.11.18 |
SQL 쿼리에서 알 수 없는 열이 참조되는 이유 (0) | 2022.11.18 |
파이프를 Runtime.exec()과 함께 작동시키는 방법 (0) | 2022.11.08 |
$HOME 폴더에 pip 패키지를 설치하는 중 (0) | 2022.11.08 |