MySQLの日本語文字化け対策

MySQL

MySQLを使用するアプリケーションで日本語の文字化けが発生する場合、MySQLとアプリケーションの文字コードが一致していないことが多いです。
解決策の一つとして、MySQLサーバーとMySQLクライアントで同じ文字コードを使うようにして、文字コード自動変換機能を使わないようにする方法があります。

MySQLの設定ファイルmy.cnfを以下のように変更すると、解決できることが多いようです。

4.1系

 

MySQLとアプリケーションの文字コードを明示的に設定する。
文字コード名は実際に使う文字コードに置き換えてください。(utf8, sjis等)

 [mysqld]
 character-set-server=ujis
 init-connect=SET NAMES ujis

5.0系

アプリケーションでMySQLからデータを取得するときに、文字コードの自動変換を行わないようにする。

 [mysqld]
 default-character-set=utf8
 character_set_server=utf8
 
 skip-character-set-client-handshake

MySQLの日本語環境の詳細については下記リンクを参照してください。
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40
http://itpro.nikkeibp.co.jp/article/COLUMN/20070614/274802/?P=1&ST=oss

  • mysqlで自動変換を止めても文字化けが直らなかったのですが、上記skip-character-set-client-handshakeで直りました。ありがとうございました。 — mocapapa {2009-01-09 (金) 16:42:49}
  • [mysqld]とすぐ上に書くのを書いていなくてなかなか反映されませんでした。 — ななし {2010-05-12 (水) 13:30:52}
  • skip-character-set-client-handshakeのみで文字化け直りました。感謝です。default-character-set=utf8を記述するとエラーが発生しmysqldが立ち上がりませんでした。 — なおちゃん {2012-01-15 (日) 01:40:23}

MySQL 重複する項目名をSELECT

MySQL

MySQL 重複する項目名をSELECTする際、エイリアスをつける

ここに2つのテーブルがあります。
ninjyaテーブルと、skillテーブルです。
ninjyaテーブルには、忍者の名前、skillテーブルには必殺技の名前が格納されています。
一人の忍者は多くの必殺技を持つという、1対他のデータ構造になっています。

|>|ninjya テーブル|h
|id|name|h
|1|ナルト|
|2|サスケ|

#br

|>|>|skill テーブル|h
|id|ninjya_id|name|h
|1|1|螺旋丸|
|2|1|ナルトキック|
|3|2|千鳥|
|4|2|天照|

このように、idをすべてのテーブルで共通で利用している場合もあるでしょう。
ただ単に連結したデータを取得します。

 SELECT *
 FROM ninjya
 JOIN skill ON skill.ninjya_id = ninjya.id
 ORDER BY ninjya.id
 LIMIT 0 , 30

取得結果は次の通りです。

|id|name|id|ninjya_id|name|h
|1|ナルト|1|1|螺旋丸|
|1|ナルト|2|1|ナルトキック|
|2|サスケ|3|2|千鳥|
|2|サスケ|4|2|天照|

フィールド名に、idというのが2つありますよね。
このデータを加工したり、表示したりする際、面倒です。
エイリアスを利用して

 SELECT 
     ninjya.id AS ninjya_id,
     skill.id AS skill_id,
     ninjya.*, skill.*
 FROM ninjya
 JOIN skill ON skill.ninjya_id = ninjya.id
 ORDER BY ninjya.id
 LIMIT 0 , 30

としてみます。
取得結果は次の通りです。

|ninjya_id|skill_id|id|name|id|ninjya_id|name|h
|1|1|1|ナルト|1|1|螺旋丸|
|1|2|1|ナルト|2|1|ナルトキック|
|2|3|2|サスケ|3|2|千鳥|
|2|4|2|サスケ|4|2|天照|

MySQL 日本語文字化け対策2

MySQL

MySQL日本語文字化け対策

XAMPP1.7.4, MySQL5.5.8環境での話です。

MySQLで日本語を入れると、??と文字化けしてしまいました。
MySQLの日本語文字化け対策にて既出だと思い、同じくやってみようと思ったところ、my.cnfがありません。

「えっ??」
と思い、
\xampp\mysql\bin
のmy.iniを編集したところ、これでMySQLの設定ができそう。
しかし、既出の

 [mysqld]
 default-character-set=utf8
 character_set_server=utf8 
 skip-character-set-client-handshake

をつけると、MySQLサーバーが起動しなくなります。

 default-character-set=utf8

をつけないで、

 [mysqld]
 character_set_server=utf8 
 skip-character-set-client-handshake

だけをmy.iniに加えれば、起動するようになり、文字化けも治りました。
最後に再起動するのを忘れないようにしましょう。

あるいは、テーブルの照合順序がutf8_general_ciなどの文字コードでないと、??に文字化けしてしまうことがあります。

MySQL 文字化けしたデータを表示

MySQL

MySQL 文字化けしたデータを表示する

MySQL 4.1.22

照合順序がlatin1やutf8-unicode-ciのままデータを投入すると、データが文字化けしてしまうことがあります。

私の場合は、データベースの中身は文字化けしてlatin1になっているのですが、PHPのプログラムで出力するときは、文字化けしないので、そのまま利用していました。
しかし、他のデータベースをUTF-8で利用する必要があり、DBが文字化けしてしまう設定のままではまずいので、既存のDBのデータは手を入れず新しいDBは文字化けを直すようにすることを考えました。

 既存のDB←DBの文字コード:latin1 
 新しく作成するDB←DBの文字コード:utf-8

上記のまま利用すると、新しいものが文字化けしてしまう、ということです。

ということで、文字化けはMySQLの日本語文字化け対策のように修正し、既存のDBは一度

 " SET CHARACTER SET latin1";

とMySQLの文字コードをlatin1にセットしてから表示するようにして、文字化けを解消しました。

MySQL 値を加算する

MySQL

MySQLで簡単に値を加算する方法です。
お恥ずかしい話ですが、知る前はプログラムで値を取り出して、値に加算してからMySQLに入れてました。(^_^;

例:test_tableというテーブルのpointという値を、idが$idに一致した項目だけ加算する場合

 UPDATE test_table SET point = point+1 WHERE id = $id;
  • 参考にさせていただきました。 — ななしのこんぺいとう {2012-03-11 (日) 10:59:06}