83's

Top > Tags > MySQL

MySQL

タイトル一覧を表示 | 本文を表示

GaucheでMySQL/SQLiteの個人的まとめ February 05, 2008 21:49

大体使い方がわかってきた。Gauche:DBI/DBD見れば わかるけど、一応流れをメモっておく。

MySQLのドライバはDBI | dev | Kahua Projectから、SQLite3のはそのページに見当たらないのでuchizonoにあったものを使わせてもらた。

レッツ・コネクト。

(use dbi)

(define *mysql-con* (dbi-connect "dbi:mysql:db=test;host=localhost" :username "root" :password "himitsu"))

(define *sqlite-con* (dbi-connect "dbi:sqlite3:path/to/db/test.db"))

クエリ。

(let1 q (dbi-prepare *mysql-con* "insert into books (name, price) values (?, ?)")
  (for-each (pa$ apply dbi-execute q) 
            '(("JavaScript" 4200) ("On Lisp" 3800))))

?に値を入れられるのがイカス。つまり

(dbi-execute q "JavaScript" 4200)

で1つめの?に"JavaScript"、2つめの?に4200。

手軽にやりたければ

(dbi-do *mysql-con* "insert into books (name, price) values (\"SICP\", 4600)")

次は結果の取り出し。

dbd/mysql.scmを見ると、クエリ結果のクラス<mysql-result-set><relation><sequence>を継承してる。

gosh> (use gauche.sequence)
gosh> (for-each print (dbi-do *mysql-con* "select * from books"))
#(1 4200 JavaScript)
#(2 3800 On Lisp)
#t

各レコードはベクタになってた。

ちなみにSQLiteのほうの<sqlite3-result-set><collection>を継承してる。

gosh> (use gauche.collection)
gosh> (for-each print (dbi-do *sqlite-con* "select * from books"))
(1 4200 JavaScript)
(2 3800 On Lisp)
#t

こっちはリストだった。

10月に読んだ本とか November 08, 2006 05:02

ちと遅くなったけど。

( ´∀`)つ ライド・オン・Rails Ruby on Railsを徹底攻略

本番サーバへの設置の話とか、Rails周りのところを見たくて購入。 lighttpdの設定とか書いてあるから!  「ググれカス」に理不尽さを覚えたあなたはこれを買うといいよ。 あとHyper Estraierとかruby-gettextとか携帯の話とか。これはいつかきっと御世話になる。

前に読んだRailsの育て方とか AWDwRとは 半分くらい話がかぶらないんでお徳な感じ。

( ´∀`)つ パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法

リファクタリングの 下巻とも言うべき本。こういういつ読んでも味がするようなスルメな本は貴重。 設計が汚いなと思ったときの改善のヒントとして傍らに置いておきたいような本だが、 これが必要になるようなものをなかなか作る機会がない(´・ω・`)

( ´∀`)つ MySQLによる最速RDBMS構築ガイド

enibloで定期的にバックアップとんないといけないんで、そこはとても役に立った。 分からないところも多数orz  やっぱ中途半端にSQLiteとか使うよりもしっかりMySQLを使うことにする。

なんかバイト先にある本ばっかなんだけど、必要な時に手元あってほしいので購入。 11月はこんなペースじゃ読めないなー。10月の1週目は授業初日にも関らずオレは大学にいなかったけど、 これらを読んで夜更ししてました。

自分の興味あることに投資できるようになったんで、バイトさせてもらってホント最近は良い感じです。 ネットにごろごろいるスーパーハカー大学生の数百分の一の生産性もありませんが、 就職までの間どうかよろしくお願いしますm(_ _)m

質問とかするためにも知識をつけなくては。 ハカーへの道は興味と好奇心によって駆動される問題解決と知識獲得の行ったり来たりと見た!  なかなか知識獲得できない金銭的負け組だったり、興味駆動じゃなくて義務駆動だったりするとどこかで止まってしまうのだ。世の中金! と時間!

自分の心に従え。夢をいくつか持て。自分自身を知れ。他人に自分の道を指示させるな。「これが人生を成功に導く。」「これらの学校に進んで、これらの講義を取れ。」「こういう種類の仕事をするべきだった。」「人生の階段はこのように上らなければならない。」そういうことは言わせるな。何であれやりたいことがあり、それをやり成功する情熱があれば、成功する。

ウォズニアックかこいいよウォズニアック '`ァ,、ァ(*´Д`*)'`ァ,、ァ 学校さぼる言い訳に使えそうですw よーし、積ん読片付けるぞー。

MySQLの文字コードに関するメモ3 September 23, 2006 18:36

一応latin1のテーブルにutf8突っ込んでた今回のケース、どう操作したかメモっとく。

my.cnfの[mysqldump]を

default-character-set=binary

としてまずダンプ。これは

$ mysqldump --default-character-set=binary

でも同じことだと思う。

binaryにすると文字コードが変換されないらしい。 オレのはlatin1のテーブルにutf8らしき文字コードで文字が入ってたんだけど、 ダンプしたものを見てみるとやっぱりutf8だったんだなと確認できた。

それから、CREATE TABLEにDEFAULT CHARACTER SET utf8を追加して

$ mysql -u root --default-character-set=utf8 -D test_production < dump_file

て感じでリストア。

……ありゃ、ためすぎたRailsのMLを片付けてたらrails:1358にMySQLの文字コードの話があったよ。 やっぱ文字コードはまるよね!

質問2:(typoにおいて)テーブルに設定された文字コードがlatin-1であるのに、なぜ日本語を保持 、表示できているのでしょうか。

これはオレも疑問だった。 とりあえずはっきりしてるのは、 オレのケースではlatin1のテーブルにutf8のコードで文字が格納されてたってこと。

Rails側がutf8なのを考えると、mysqldとRailsの間でやりとりするときに文字コードの変換が起こらなかったんじゃないか。 で、変換が起こらないための条件はテーブルとクライアント側の文字コードが同じってところだろうから、 mysqldはRailsをlatin1として扱ってたんじゃないかなぁ。 latin1-latin1だからutf8を変換せずにそのまま格納って感じ。

Railsがlatin1扱いされたのはSET NAMSES utf8とかしなかったから。 クライアントが文字コードの指定をしてこなかった場合 mysqldはそれをlatin1として扱うんじゃないすかね。 charsetを指定していないテーブルをそうするように。

そういえばmy.cnfに[client]って項目があるけど、 ここはmysqlコマンド以外のクライアントのための設定なんだろうか。

うーん、今まで何度かMySQLとかSQLiteとかで日本語使ったけど、 ホント理解せず使ってても動くもんだから余計はまるよ。 SQLiteのほうは日本語どうなってんだろう……。

あー、こんなエントリ書いてないで本とかマニュアルとか読めって声が聞こえてきそう。 やだよwww 時間ないもん。

MySQLの文字コードに関するメモ2 September 22, 2006 22:43

メモ。正しくない可能性があるので注意。

MySQLのテーブルの文字コードを指定するにはmy.cnfの[mysqld]で

default-character-set=utf8

とするか、

CREATE TABLE table_name ( ... ) DEFAULT CHARACTER SET utf8;

とか

name VARCHAR(255) CHARACTER SET utf8

のように個別に指定する。

mysqldはクライアントの文字コードに合わせてやりとりするデータの文字コードを変換しているようなので、 utf8のテーブルと正しくやりとりするには、

SET NAMES utf8

のようにクライアント側の文字コードを適切にセットするか、 文字コード変換を抑制するようmy.cnfの[mysqld]に

skip-character-set-client-handshake

と書く。

Railsではdatabase.ymlにencodingを追加するとSET NAMESしてくれる。

 development:
   adapter: mysql
   database: test_development
   username: root
   password:
   encoding: utf8
   socket: /var/run/mysqld/mysqld.sock
   host: localhost

まだよくわかってないけど、char_length()が文字数と一致するようになったし varchar(20)は21文字目以降が切られるようになった。

あー、本買わないとダメかなぁ。あんま興味ないが。

MySQLの文字コードに関するメモ September 22, 2006 02:36

ろくな知識もなくデータベース使ってるもんだからいろいろわかんない。良くないすなぁ。

とりあえず最近アウトプットが少ないので、初心に帰って調べたことをメモ。

MySQLは4.1からcharとかvarcharとかのあとについてる数字(char(10)の10)がバイト数から文字数になったと聞いていたのに文字が変なところでチョン切られるからおかしいなあと思っていた。

ちょっと調べてみた中で目にした関数を試しに使ってみると、文字数を返すはずのcharacter_length()でバイト数みたいな数字が返ってくるし、charset()をするとlatin1って返ってくるもんだから、あー、これutf8じゃないよ……という結論になった。

まーデータ自体はutf8のコードで保存されているんだろうけど、MySQL内での扱いがlatin1ってことかな。Railsでもmysqlでも化けなかったってことは。

mysql> show variables like "char%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql:9586によると、character_set_databaseてのがCREATE DATABASE で文字コードが指定されなかった場合、database の文字コードはこれになる。ということなので、ああ確かにオレのはlatin1になるな、と。

my.cnfの[mysqld]のところにdefault-character-set=utf8と書いておけば良さそうですよ。

クライアント側はサーバと別の文字コードを使うことが出来て、これが

mysql --default-character-set=utf8

とか

mysql> set names utf8

とかで変更できるそうだ。ふむふむ。

使える文字コード一覧は、

mysql> show character set;

euc-jpをujisと書いたりするから注意、と。

日本語が入るとmysqlコマンドで表を出力したときに罫線がずれてたんだけど、これはこの文字コードにからんだ問題だったみたい。(参考:mysqlのオプション指定でテーブルの縦線を揃える

さて、これでMySQLの理解が一つ深まったんだけど、問題はすでにあるデータベース。

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

肝心のcharacter_set_databaseがlatin1のままだよママン(´Д⊂)

変え方がわからないので、mysqldumpして create tableにdefault character setを追加してリストアしてutf8になりました。

/tmp/mysql.sockが見つからないって言われた August 25, 2005 18:54

RailsのPDFも読まずに「How to make a todo list program with Rails」の チュートリアルをやってみてるんだけど、

No such file or directory - /tmp/mysql.sock

ときたもんだ。

この解決方法は樂水開発日記さんの「MySQLのソケットの位置はどうやって指定する?」 に書いてあるんだけど、あとでぱっと見てわかりやすいようにメモメモ。

[yz@localhost Todo]$ mysqladmin -p version
Enter password:
mysqladmin  Ver 8.40 Distrib 4.0.23a, for pc-linux-gnu on i686
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version          4.0.23a-standard
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket         /var/lib/mysql/mysql.sock
Uptime:                 3 hours 58 min 57 sec

Threads: 2  Questions: 164  Slow queries: 0  Opens: 9  Flush tables: 1  Open tables: 2  Queries per second avg: 0.011

/tmp/mysql.sockじゃなくて、/var/lib/mysql/mysql.sockだ、と。

で、config/database.ymlに設定を書くらしい。

development:
  adapter: mysql
  database: todo
  host: localhost
  username: root
  password:
  socket: /var/lib/mysql/mysql.sock

これででけた。