それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

MySQLの文字コード

mysqlにターミナルからつないだ場合、クライアントの文字コードがうまく行かなくて化けることがある。基本的にUTF-8だと思っておいて

SQLシェルから

set names utf-8;

と打てば大抵うまく行く

使用可能な文字コード

show character set;

で見られる。

テーブルの文字コードを確認するには

mysql> show create table Recorder_Tbl;
| Recorder_programTbl | CREATE TABLE `Recorder_programTbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `channel_disc` varchar(128) NOT NULL DEFAULT 'none',
  `channel_id` int(11) NOT NULL DEFAULT '0',
  `type` varchar(8) NOT NULL DEFAULT 'GR',
  `channel` varchar(10) NOT NULL DEFAULT '0',
  `title` varchar(512) NOT NULL DEFAULT 'none',
  `description` varchar(512) NOT NULL DEFAULT 'none',
  `category_id` int(11) NOT NULL DEFAULT '0',
  `starttime` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `endtime` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
  `program_disc` varchar(128) NOT NULL DEFAULT 'none',
  `autorec` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `program_ch_idx` (`channel_disc`),
  KEY `program_st_idx` (`starttime`)
) ENGINE=MyISAM AUTO_INCREMENT=305647 DEFAULT CHARSET=utf8 |
+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)


などで見ればいいんじゃないかな。

ヤヤコシイのは次の場合

UTF8のテーブルにCP932突っ込んでる
ターミナルがCmd.exeでCP932前提。


SQLプロンプトで、こういう場合は。ちゃんと意識してシェルをかます。

#!/usr/bin/env
Open3.open{|in,out,err|
}

などを使って、文字コードを変換するパイプを作り、STDOUT/STDINをラップする。
プログラム側からはデコードの嵐。