2012年5月31日木曜日

Vimで文字コード変更

MySQL4にEUCで入っているデータをUTF-8に変換しようとして、
mysqldumpでSQL出してnkfで文字コード変換した。

それを流し込んだところ、SQLの構文エラーが出る。
よく見てみたところ、SQL内の文字列の終わりのクォーテーションが無い。
(1,2,'あいうえお1かきくけ,'さしすせそ')
みたいになっている。

nkfの変換前のデータをあらためて調べてみると、
その部分にマルチバイト文字の前半がゴミとして挟まっていた。
(1,2,'あいうえお1かきくけゴミ','さしすせそ')
こんな感じ。
nkfだとそのゴミを直後のクォーテーションと絡めて消してしまうようだ。

さほど巨大ではないSQLだったので、Vimで変換した。
Vimで開き、
:e ++enc=eucjp-ms
:set fileencoding=utf8
:wq!
これでEUC→UTF-8に変換して保存できる。

該当箇所のゴミは「?」になるようだ。
(1,2,'あいうえお1かきくけ?','さしすせそ')

2012年5月26日土曜日

virt-managerでlibvirtdに繋ぐ場合

何も考えずにlibvirtdインストールして動かして、
そこにvirt-managerインストールして動かして接続しようとすると
Not Connectedの状態になって繋がらない。
でもsudoで動かすと繋がる。

そんな場合はユーザをlibvirtdグループに追加すればよい。
sudo usermod -a -G libvirtd 【自分のユーザ名】
設定したら一度ログアウトしてログインしなおす。

2012年5月21日月曜日

mysqldumpでlocalhostのポート指定

リモート環境のmysqlをsshポートフォワード経由でlocalhost:13306にマップして接続し、
ローカル環境のmysqlとスキーマ等の違いを確認するためにmysqldumpを使った。
manを見る限り、ポート番号は -P または --port= で指定出来ると書いてある。

mysqldump -h localhost -P 13306 -u XXX -p XXX -d --compact XXX > out.sql
そしてローカルのmysqlに対し同様に出したsqlと比較。

奇跡の完全一致。

そんなバカな。

ローカルのmysqlを停止させて実行してみる。
mysqldump: Got error: 2002: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2) when trying to connect
やっぱり。

エラーメッセージからするに、ドメインソケットを使ってるっぽい。
-P 指定していてもお構いなしっていうのはどっちかというとバグなんじゃないのかな。

強制的にTCPを使用させればうまくいく。
mysqldump --protocol=TCP -h localhost -P 13306 -u XXX -p XXX -d --compact XXX > out.sql

2012年5月3日木曜日

mysql5.5のcharset指定

ubuntu 12.04のmysqlは5.5。

DBのデフォルトの文字コードをutf8にするのに前までは
/etc/mysql/conf.dの下に charset.cnf とか適当な名前で
[mysqld]
default-character-set=utf8
と書いていたけど、5.5だとエラーになってしまう。

[mysqld]

character-set-server=utf8 
に書き換える。