カテゴリー別アーカイブ: mysql

MySQLの文字化け対応

下記のような仕様で管理しているDBと表示の際の文字コードが異なる場合がよくある。

DB:UTF-8
表示:Shift-JIS (プログラムソースコード:Shift-JIS)

その場合、日本語の文字化けが発生するので、回避策として下記の変換をしているが

mb_convert_encoding($mojibake, ‘SJIS’, ‘UTF-8′);

「髙」や「﨑」の特殊文字があると正しく変換されないため、おすすめできない。
しかし、下記を実施すると

mb_convert_encoding($mojibake,’SJIS-win’, ‘UTF-8′);

正しく変換されるがプログラム修正が多くなる場合がある。
そこでおすすめしたいのが、「set names cp932」だ。
データ取得前に、SQLで実行するだけと、プログラマにやさしい
これは「set names sjis」と実行し文字化けた場合にも有効なのだ。

MT4.0から4.1以上にアップした際の文字化け対策

アップデートしたMySQLのデフォルト文字コード設定をUTF8にし忘れた上に、古いMySQLのdumpデータも失くして、latin1で登録されてしまい日本語が文字化けした際の対処法

latin1からバイナリで変換
ALTER TABLE `mt_entry` MODIFY `entry_text` VARBINARY(30000),
MODIFY `entry_keywords` VARBINARY(30000),
MODIFY `entry_title` VARBINARY(255);

バイナリからUTF8の元種別に変換
ALTER TABLE `mt_entry` MODIFY `entry_text` mediumtext CHARACTER SET utf8,
MODIFY `entry_keywords` mediumtext CHARACTER SET utf8,
MODIFY `entry_title` varchar(255) CHARACTER SET utf8;

VARBINARYじゃなくBINARYでも行けそうですが、ここの環境だと文字化けしました
VARBINARYの長さはデータに合わせて調整してください

以下、MT4.1の変更用SQL

ALTER TABLE `mt_entry` MODIFY `entry_text` VARBINARY(30000),
MODIFY `entry_keywords` VARBINARY(30000),
MODIFY `entry_title` VARBINARY(255);

ALTER TABLE `mt_entry` MODIFY `entry_text` mediumtext CHARACTER SET utf8,
MODIFY `entry_keywords` mediumtext CHARACTER SET utf8,
MODIFY `entry_title` varchar(255) CHARACTER SET utf8;

ALTER TABLE `mt_asset` MODIFY `asset_description` VARBINARY(30000),
MODIFY `asset_label` VARBINARY(255);

ALTER TABLE `mt_asset` MODIFY `asset_description` mediumtext CHARACTER SET utf8,
MODIFY `asset_label` varchar(255) CHARACTER SET utf8,
MODIFY `asset_class` varchar(255) CHARACTER SET utf8,
MODIFY `asset_file_ext` varchar(20) CHARACTER SET utf8,
MODIFY `asset_file_name` varchar(255) CHARACTER SET utf8,
MODIFY `asset_file_path` varchar(255) CHARACTER SET utf8,
MODIFY `asset_mime_type` varchar(255) CHARACTER SET utf8,
MODIFY `asset_url` varchar(255) CHARACTER SET utf8;

ALTER TABLE `mt_author` MODIFY `author_hint` VARBINARY(75);

ALTER TABLE `mt_author` MODIFY `author_hint` varchar(75) CHARACTER SET utf8;

ALTER TABLE `mt_blog` MODIFY `blog_description` VARBINARY(30000),
MODIFY `blog_name` VARBINARY(255);

ALTER TABLE `mt_blog` MODIFY `blog_description` mediumtext CHARACTER SET utf8,
MODIFY `blog_name` varchar(255) CHARACTER SET utf8;

ALTER TABLE `mt_category` MODIFY `category_label` VARBINARY(100);

ALTER TABLE `mt_category` MODIFY `category_label` varchar(100) CHARACTER SET utf8;

ALTER TABLE `mt_comment` MODIFY `comment_text` VARBINARY(30000);

ALTER TABLE `mt_comment` MODIFY `comment_text` mediumtext CHARACTER SET utf8;

ALTER TABLE `mt_log` MODIFY `log_message` VARBINARY(30000);

ALTER TABLE `mt_log` MODIFY `log_message` mediumtext CHARACTER SET utf8;

ALTER TABLE `mt_tag` MODIFY `tag_name` VARBINARY(255);

ALTER TABLE `mt_tag` MODIFY `tag_name` varchar(255) CHARACTER SET utf8;

ALTER TABLE `mt_template` MODIFY `template_text` VARBINARY(30000);

ALTER TABLE `mt_template` MODIFY `template_text` mediumtext CHARACTER SET utf8;

ALTER TABLE `mt_trackback` MODIFY `trackback_description` VARBINARY(30000),
MODIFY `trackback_title` VARBINARY(255);

ALTER TABLE `mt_trackback` MODIFY `trackback_description` mediumtext CHARACTER SET utf8,
MODIFY `trackback_title` varchar(255) CHARACTER SET utf8;