データーベースの文字コードをUTFー8にする

Date 2016-5-24 8:47:37 | Topic: XOOPS

現在XOOPSのDATABASEの文字コードはEUCーJPである。これはXOOPSのバージョンが2.0.16だった頃からの遺産である。そろそろUTFにしようと思う。
OSはCentOS6.7なのでこちらは既にUTFであるので、データーベースの文字コードを変更する。その前に現在の状況を把握する。まずはデーターベース、mysqlにログイン
# mysql -u ユーザー名 -p
パスワードを聞かれるので入力
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
全部 UTF8(もちろんファイルシステムとDIRは違う)
XOOPSで使用しているデーターベースの各テーブルの文字コード(mysqlは各テーブルに文字コードを設定できる)
mysql> show table status from データーベース名;
でテーブルの設定が表示されるので、Collation の所を見ると全部 ujis_japanese_ci になっていたので、EUC-JPである。
続いてPHPの設定の確認、
# gedit /etc/php.ini
抜粋
;default_charset = "iso-8859-1"

;mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
;mbstring.encoding_translation = Off
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
;mbstring.func_overload = 0
;mbstring.strict_detection = Off
;mbstring.http_output_conv_mimetype=
全部コメントアウトしてある(php.iniは ;(セミコロン)がコメントである)
私の自宅サーバーのapacheはバーチャルホストの設定があり、自身が管理していないWEBがあり、UTFー8、shift-jis、EUCーJPを使用している。
一様 mysqlの設定も
# gedit /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
innodb_buffer_pool_size = 256M
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
join_buffer_size = 128M
sort_buffer_size = 2M
read_rnd_buffer_size = 2M
datadir=/XXXXXXX/XXXXXX デフォルトから変更してある
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
#symbolic-links=0
# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 

character-set-server = utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid



ここから本題、二つの方法を書いておく。どちらかでいい、まずは phpMyAdmin を使う方法
XOOPSのデーターベースを選んでから、右ペインの上のタブで エクスポート をクリック、その後、実行をクリックすると、開くか保存か聞いてきますので、保存を選び、OKをクリック、次に保存場所を聞いてきますので、適当に選びOK。すると選んだデーターベース名.sqlというファイルが保存されます。このファイルの文字コードはOSのコードつまりUTF−8で保存されています。
但し、このファイルには各テーブルの文字コードがujis(EUC-jp)になっていますので、utf8に変更します。
# cat データーベース名.sql | sed -e 's/ujis/utf8/g' > データーベース名-1.sql
これで、インポートする時にテーブルの文字コードはUTF-8になります。
次にインポートしますが、その前にデーターベースを作ります。
画像2の右ペインの上の データーベース タブをクリック(左ペインで、データーベースを選んでいると、このタブが表示されませんので、PhpMyAdminのロゴの下、一番左をクリックすると表示されます)。データーベース名を適当に付け、照合順序を utf8_general_ci にし、作成をクリックすると、データーベースが作成されます。

作成されたデーターベースを選び(画像3)右ペインで インポート タブをクリック、参照をクリックし、先ほど保存したデーターベース名-1.sqlを選び、ファイルの文字セットがUTF-8になっているのを確認し、実行をクリックすると、インポートされます。 インポートは正常に終了しました。と表示がでたらOKです。
その後、作ったファイルを削除する(データーベース名.sqlとデーターベース名-1.sql。セキュリティーの為)

次はphpMyAdminを使わないでやる方法
Xoopsで使用しているデーターベースをバックアップする。
# mysqldump -u ユーザー名 -p --databases XOOPSのデーターベース名 > xoops.sql

このファイルの文字コードを調べる(OSの文字コードの筈だが)端末の上部メニューの 端末(T)、文字コードの設定(C)とクリックし、Unicode(UTF-8)が表示されるのを確かめて
# cat xoops.sql
これで端末上にデーターが流れるように表示される(データー量が多いので)その時、漢字が文字化けしていなければ、このファイルの文字コードはUTF-8である。
見にくい時は more を付けて
# cat xoops.sql | more
でスペースを押すと、次になるので漢字が表示される所までやる。確認後 ctrl+c で終わらせる。
確認が出来たら xoops.sql を編集しますが、する事はデーターベース名の変更(変更しないとオリジナルのデーターベースに上書きするので)各テーブルの文字コードをutf8にする。
# cat xoops.sql | sed -e 's/XOOPSのデーターベース名/新データーベース名/g' -e 's/ujis/utf8/g' > xoops4.sql
出来た xoops4.sql をmysqlにインポートします。
# mysql -u ユーザー名 -p < xoops4.sql
パスワードを聞かれますので入力。
これで、新データーベース名でデーターベースが出来ていることを確認しておきます。
又、セキュリティーの為、作ったファイル(xoops.sqlとxoops4.sql)を削除しておきます。
これでやっとデーターベースの各テーブルの文字コードとデーターの文字コードがUTF-8になりました。

ここからはXOOPSの設定
まずはデーターベースを変更する
# gedit XOOPSのルートディレクトリー/mainfile.php
	// Database Name
	// The name of database on the host. The installer will attempt to create the database if not exist
	define('XOOPS_DB_NAME', 'UTF8にした新データーベース名'); ←データーベース名を変更



保存したら、
つぎはXoopsのwebに管理者としてログイン後、ユーザーメニューの管理者メニューをクリック、左ペインの SYSTEM ADMIN をクリック後、一般設定、もう一度一般設定で画面を開き(画像5)使用言語を ja_utf8 にしてから、下にスクロールダウンし、送信をクリック。
アレー文字化けはしていないが、文字コードを確認するとEUC-JPのままだ、UTF-8にすると文字化けする。
色々悩んだが、思い出した、このXOOPSはJPExを使っていた。確か何処かに文字設定があった筈、やっと include/ini_settings.php を見つけ
<?php
/**

 ;Example: If your database character is EUC-JP, it should be ujis.
 ;Example: If your database character is UTF-8, it should be utf8.
 ;charcode=utf8

 */
charcode=utf8 ここをujisからutf8に変更
?>

これを保存し、ブラウザでアクセスし、文字コードを確認するとUTF-8になっていた。
但し、一部に文字化けがあるので、多分キャッシュのせい、
XOOPSのルートディレクトリーにある、二つのディレクトリー(cacheとtemplate_c)の中身を全て削除し、再度アクセスすると文字化けは無くなっていた。
私の場合はXOOPSにJPExを使っているので、Language以下の定数が漢字で定義している部分などは既にutf-8ようがあるので、問題ないが、他のバージョンでは多分必要、他にも文字コード変更が必要かも?


This article comes from 錦稜会 KINRYOKAI
https://www.kinryokai.net

The URL for this story is:
https://www.kinryokai.net/article.php?storyid=294