それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

php, mysqlで wordpress のテーブルへ pdo したときに文字化けする。

機種依存文字が化けます。

めっちゃ化けます。とくに、外字的な、ハシゴダカのような文字列を扱えません。PDOまじアレ。

PDOのマニュアルとか検索結果を見ても、ほとんど情報がないんですよね。困りました。

Windowsだと外字に登録するような文字列であっても、UTF-8では扱えるのですが、一部の文字では正しく変換されずにクエスチョンマークになって情報が落ちてしまう。

文字化けといえば、文字化けなのですが、豆腐に近い状態の文字化けなのです。

文字コードを次のようにします。

<?php
$pdo = new \PDO( "mysql:host=${host};dbname=${name};charset=utf8mb4", $user, $pass);

または

<?php

$pdo = new \PDO( "mysql:host=${host};dbname=${name}", $user, $pass, [\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"] );

wordpressMySQLの場合、文字コードがutf8mb4になっています。

そのため文字コードutf8mb4 で指定しなくては、ある種の文字が化けます。

wordpress で 直接SQLを発行する場合

<?php

function getPDO (): \PDO {
  [$host, $name, $user, $pass] = [DB_HOST, DB_NAME, DB_USER, DB_PASSWORD];
  $pdo = new \PDO( "mysql:host=${host};dbname=${name};charset=utf8mb4", $user, $pass,
     [\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"] );
  //
  $pdo->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
  //
  return $pdo;
}
function getMySQLi(){
  $mcli = new \mysqli(DB_HOST,DB_USER, DB_PASSWORD, DB_NAME);
  $mcli->set_charset('utf8mb4');
  return $mcli;
}