ブログ   うい・らぶ・だいびんぐ   Cube 別館   flag_uk 英語サイト   ポータル
twitter Twitter でログイン
ホーム   最新ニュース   フォーラム   ダウンロード   写真集   リンク集   お問い合わせ RSS

SmartSection > xoops > MySQL 4.1 にて XOOPS 2.0.16a JP を動かす

MySQL 4.1 にて XOOPS 2.0.16a JP を動かす

投稿者: Ken 掲載日: 2008-8-10 (8891 回閲覧)
問題点

MySQL 4.1 以降では XOOPS 2.0.16a JP は文字化けします。

これは、XOOPS 特有の問題ではなく、多くのプログラムが同じ問題を抱えています。

原因

MySQL 4.1 からクライアントからの言語指定が必要になったためです。

4.0 までは データベースへの入力において何もしていなかったので、
データベースの言語設定が EUC-JP でなくとも EUC-JP の格納が可能でした。

4.1 からは データベースへの入力において言語変換を行うようになりました。
データベースの言語設定が EUC-JP に設定しても、デフォルトの入力は latin-1 になります。
入力時は EUC-JP -> UTF-8 -> latin-1 のように変換され、出力時は逆の変換が行われます。
変換できない文字があった場合は、それ以降が切り捨てられます。

対策

クライアントである XOOPS から明示的に言語指定をします。
データベースの言語設定とクライアントからの言語指定が同じ場合は、言語変換は行われないので、
4.0 までと同じ動作になります。

class/database/mysqldatabase.php 90行目

function connect($selectdb = true)
{
  if (XOOPS_DB_PCONNECT == 1) {
    $this->conn = @mysql_pconnect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS);
  } else {
    $this->conn = @mysql_connect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS);
  }

...

// この行を追加する
  mysql_query("SET NAMES ujis", $this->conn);

  return true;
}


PHP 5.2.3 以降では mysql_set_charset という関数が用意されました。
こちらを使うことが推奨されています。

XOOPS Cube Legacy 2.1

XOOPS Cube Legacy 2.1 では問題ありません。
プログラム実行時に下記にファイルが読み込まれます。

modules/legacy/language/japanese/charset_mysql.php

$GLOBALS['xoopsDB']->queryF("/*!40101 SET NAMES ujis */");
$GLOBALS['xoopsDB']->queryF("/*!40101 SET SESSION collation_connection=ujis_japanese_ci */");


「 /*!40101 xxx */ 」 はコメント構文によるバージョン指定

参考

- MySQLマニュアル:接続のキャラクタセットおよび照合順序
SET NAMES は、クライアントから送信される SQL ステートメントのキャラクタセットを示します。

- MySQLマニュアル:コメント構文
‘!’文字の後にバージョン番号を追加する場合、コメント内構文はMySQLバージョンが特定のバージョン番号と同等かそれ以上の場合にのみ実行されます。

- PHPマニュアル:mysql_set_charset
- SET NAMESは禁止

ページ移動
良く読まれた記事 XOOPS 2.0.18 にて D3 モジュールを動かす 有償サポート 次の記事
投票者の合計: 0
平均: 0
投稿された内容の著作権はコメントの投稿者に帰属します。
スポンサー

寄付
配布しているソフトが気に入ったら、寄付をお願いします。
寄付

PageRank のページ毎の表示
http://linux.ohwada.jp/ modules/smartsection/item.php?
PageRank 0 PageRank

メインメニュー

マニュアル

ログイン