■
[mysqld] # character-set-server = latin1 # collation-server = latin1_general_ci #character-set-server = utf8 #collation-server = utf8_unicode_ci character-set-server = ujis collation-server = ujis_japanese_ci #character-set-server = sjis #collation-server = sjis_japanese_ci skip-character-set-client-handshake
Xoopsの基本システムに関係する項目(日本語環境EUC-JP)のサンプル推奨値の例;
(php.ini 抜粋 php バージョン 4.1.2)[PHP]
register_globals = Off ;;(強く推奨)セキュリテイ上Onにするのは良くないです。
display_errors = On ;;(強く推奨)XOOPSのphpデバグ表示のために必要
;;default_charset = "iso-8859-1" 初期値
;default_charset = "EUC-JP" ;;(任意)EUC-JPを指定すると文字化けが防止されるかもfile_uploads = On ;;(推奨)ファイルのアップロード機能を使うとき必要
[mbstring]
mbstring.encoding_translation = On ;;確認要phpバージョン4.3.Xでは必要かどうかは組み合わせしだい
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = pass
mbstring.detect_order = auto
mbstring.substitute_character = none ;
ただし、「skip-character-set-client-handshake」は「character_set_server」の値を参照するので注意。
mysql コマンドでは大丈夫なのに、PHP,perl,accessなどで文字が ? に化けるのは?(文字化け) †
良くある勘違いは、
「mysqlコマンドが動いているから、自分のアプリも正しくコード変換するだろう」
というものです。
これは間違いです。次の節の概念図をじっくり見てください。
MySQL サーバーとおしゃべりしている libmysqlclient.so (libmysql.dll) に、キャラクターセットが埋め込まれています。
mysql コマンドには default-character-set のオプションがあり、キャラクターセットの指定ができます。
これは libmysqlclient.so (libmysql.dll) の埋込キャラクターセットを上書きします。しかし、MySQL AB が提供しているコマンド(mysqldump, mysql, mysqlimport等)や MyODBC 以外の、
別の誰かが作ったアプリやコマンドは、
my.cnf を読んだり、default-character-set オプションがあったりするわけではありません。
my.cnf を読んだり、default-character-set オプションが使えたり、SET NAMES 文が実行されたりするのは、
あくまでも、アプリ側の責任、作り手の責任なのです。
上の図で言えば、PHPMyAdmin や PHP 自身の部分に、キャラクターセットの指定をする処理や my.cnf を読む処理を、作り手が意図して書かない限り、実現しないのです。これは perl だろうが Ruby だろうが、access だろうが、PHP と同じです。
(MyODBC(Connector/ODBC)は設定をすることで、my.cnf の [odbc] グループを読みます。
access で MyODBC を使用しているなら、my.cnf を読むオプションを有効にしておきます。)
コードを書くのが嫌なら(変更することが出来ない状況なら)、libmysqlclient (libmysql,dll) の埋込キャラクターセットを変えるのです。
これは libmysqlclient(libmysql.dll)のコンパイルのし直しを意味します。
なお、5.0.13-rc 以上では、mysqld --skip-character-set-client-handshake とすることで、libmysqlclient はサーバーのキャラクターセットに合せるようになります。
1 つのサーバーで 1 つのキャラクターセットしか使用しない(4.0までのように)のであれば、skip-character-set-client-handshake オプションの指定だけで OK です。
このとき、libmysqlclient の re-compile は不要です。
version 4.1 以上の文字コード変換機能とうまくつきあうには?(文字化け) †
MySQL version 4.1 から、utf8 が組み込まれたり、文字コードの自動変換が組み込まれたりと、けっこう文字周りがかわりました。 4.0までの MySQL とは感覚が変わるので、一応、こうした方がトラブルは少ないね、という経験上のものを書いておきます。
* MySQL 5.0.13-rc 以上の場合、mysqld に skip-character-set-client-handshake オプションを指定する。
* mysqldump には必ず --default-character-set= を指定すること。
* MySQL サーバーとクライアントは、必ず同じキャラクターセットにしておくこと。
* 4.1以上対応のアプリケーションには、必ず "SET NAMES キャラクターセット名" という SQL 文を、サーバーに接続した直後に実行すること。
* データベース名、テーブル名、フィールド名には、マルチバイト文字は使用しないこと。
* マルチバイトキャラクターセットと、latin1などのシングルバイトキャラクターセットを混在させないようにすること。
* キャラクターセットはデータベース単位、テーブル単位、フィールド単位で指定できるが、フィールド単位でのキャラクターセットの指定はなるべく避けた方がよいだろう
* 文字の自動変換機能を抑止する、--default-character-set=binary の使用が便利。
* 既にコンパイル済みのバイナリを使うときは、そのバイナリが作成されたときに埋め込まれている、標準のキャラクターセットを知っておいた方がよい。
o !!! MySQL AB のバイナリは latin1 が標準 !!!
* 自分でコンパイルする場合は、binary キャラクターセットを標準に指定してコンパイルすれば、アプリの変更や設定の変更無しに、MySQL 4.0,3.23 対象のアプリが動く。
* --init-connect='SET NAMES キャラクタセット名' は使わない。これはクライアントコマンドオプション --default-character-set= を無効にしてしまうから。
* 4.1 の mysqldump には --hex-blob というオプションが追加されている。これは BLOB のバイナリデータを壊さずに mysqldump 可能になる。
尚、XAMPP(v1.5.1時点)を使っている場合、このオプション(init-connect)が効かないので、
C:\Program Files\xampp\mysql_start.batを開きmysqldの起動オプションに、
「--init-connect="SET NAMES ujis"」を書き加えてください。
尚、XAMPP(v1.5.1時点)を使っている場合、このオプション(init-connect)が効かないので、
C:\Program Files\xampp\mysql_start.batを開きmysqldの起動オプションに、
「--init-connect="SET NAMES ujis"」を書き加えてください。
日本人以外のデベロッパーが作ったバイナリは、ujis,sjis を標準のキャラクターセットにしているわけがありません。
事実 MySQL AB 配布のバイナリは、latin1 が標準です。
それらのバイナリを使って PHP の MySQL モジュールを動かせば(作成すれば)、クライアント(PHP)は latin1 で動作し、サーバーは ujis,sjis で動くことになるのです。こうして日本語文字は破壊されます。これらの問題を避けるには、方法は3つ。
* 5.0.13-rc 以上の場合は、mysqld --skip-character-set-client-handshake オプションを必ず指定する
* PHP(Ruby,Perl,C,...)のアプリの変更。サーバーに接続した後にすぐ、"SET NAMES キャラクターセット名" という SQL 文を実行する
* PHP(Ruby,Perl,C,...)の MySQL モジュールの標準キャラクターセットを、自分が使うキャラクターセットにする。これはアプリの変更はない。しかし、libmysql.dll, libmysqlclient のコンパイルし直しが発生する。
ただし、サーバーもクライアントライブラリーも5.0.13-rc 以上の場合、skip-character-set-client-handshake オプションが mysqld に指定されていれば、この作業は不要。