メイン

MySQL アーカイブ

2007年12月30日

C言語でMySQLを操作する

MySQLを利用する場合、WEBのシステム構築となると
フロントエンドがPHPやrubyといったスクリプトで記述することが多いと思います。

今日は、C言語からMySQLを操作するAPIを利用してみたいと思います。
私の環境はFedora7で、すでにmysqlのC APIがインストール済みなので
ヘッダファイルとライブラリファイルが以下のようにそろっています。

[root@fedora7 c]# ls /usr/include/mysql/
chardefs.h   my_config_i386.h  my_semaphore.h   mysqld_error.h  sslopt-case.h
errmsg.h     my_dbug.h         my_sys.h         raid.h          sslopt-longopts.h
history.h    my_dir.h          my_xml.h         readline.h      sslopt-vars.h
keycache.h   my_getopt.h       mysql.h          rlmbutil.h      tilde.h
keymaps.h    my_global.h       mysql_com.h      rlprivate.h     typelib.h
m_ctype.h    my_list.h         mysql_embed.h    rlshell.h       xmalloc.h
m_string.h   my_net.h          mysql_time.h     rltypedefs.h
my_alloc.h   my_no_pthread.h   mysql_version.h  sql_common.h
my_config.h  my_pthread.h      mysqld_ername.h  sql_state.h
[root@fedora7 c]# ls /usr/lib/mysql/
libdbug.a         libmysqlclient.so         libmysqlclient_r.so.15      mysql_config
libheap.a         libmysqlclient.so.15      libmysqlclient_r.so.15.0.0  mysqlbug
libmyisam.a       libmysqlclient.so.15.0.0  libmystrings.a
libmyisammrg.a    libmysqlclient_r.a        libmysys.a
libmysqlclient.a  libmysqlclient_r.so       libvio.a

試しに、次の駅テーブルの中身を表示させてみます。

mysql> describe M_STATION;
+-------------------+--------------+------+-----+---------+-------+
| Field             | Type         | Null | Key | Default | Extra |
+-------------------+--------------+------+-----+---------+-------+
| CODE              | char(7)      | NO   |     |         |       |
| RAIL_NAME         | varchar(255) | NO   |     |         |       |
| STATION_NUMBER    | int(11)      | NO   |     |         |       |
| STATION_NAME      | varchar(255) | NO   |     |         |       |
| TODOFUKEN         | varchar(20)  | NO   |     |         |       |
| STATION_NAME_KANA | varchar(255) | NO   |     |         |       |
| LAT               | double       | YES  |     | 0       |       |
| LNG               | double       | YES  |     | 0       |       |
| LAT_DMS           | varchar(30)  | YES  |     |         |       |
| LNG_DMS           | varchar(30)  | YES  |     |         |       |
+-------------------+--------------+------+-----+---------+-------+
10 rows in set (0.00 sec)

[root@fedora7 c]# gcc mysql_test.c -lmysqlclient  -lnsl -lm -lz -L/usr/lib/mysql
[root@fedora7 c]# ./a.out
[JR]函館本線(函館~長万部) 函館                         41.773746 140.726399
[JR]函館本線(函館~長万部) 五稜郭                      41.803418 140.733884
[JR]函館本線(函館~長万部) 桔梗                         41.846735 140.723046
[JR]函館本線(函館~長万部) 大中山                      41.864738 140.713482
[JR]函館本線(函館~長万部) 七飯                         41.887012 140.68855
[JR]函館本線(函館~長万部) 渡島大野                   41.905045 140.647628
[JR]函館本線(函館~長万部) 仁山                         41.930014 140.63522
[JR]函館本線(函館~長万部) 大沼                         41.971954 140.669347
[JR]函館本線(函館~長万部) 大沼公園                   41.98103 140.669888
[JR]函館本線(函館~長万部) 赤井川                      42.003267 140.642678
[JR]函館本線(函館~長万部) 駒ヶ岳                      42.038781 140.610537
[JR]函館本線(函館~長万部) 東山                         42.061728 140.605261
[JR]函館本線(函館~長万部) 姫川                         42.081301 140.591677
[JR]函館本線(函館~長万部) 池田園                      41.990661 140.700333
[JR]函館本線(函館~長万部) 流山温泉                   42.003474 140.716494
[JR]函館本線(函館~長万部) 銚子口                      42.015518 140.720673
[JR]函館本線(函館~長万部) 鹿部                         42.06439 140.771393
[JR]函館本線(函館~長万部) 渡島沼尻                   42.107041 140.747609
[JR]函館本線(函館~長万部) 渡島砂原                   42.121645 140.68954
[JR]函館本線(函館~長万部) 掛澗                         42.119211 140.646094
[JR]函館本線(函館~長万部) 尾白内                      42.111221 140.613465
[JR]函館本線(函館~長万部) 東森                         42.106845 140.593564
[JR]函館本線(函館~長万部) 森                            42.108897 140.573985
[JR]函館本線(函館~長万部) 桂川                         42.11559 140.542794
[JR]函館本線(函館~長万部) 石谷                         42.13553 140.506553
[JR]函館本線(函館~長万部) 本石倉                      42.159668 140.471957
[JR]函館本線(函館~長万部) 石倉                         42.172839 140.458461
[JR]函館本線(函館~長万部) 落部                         42.187544 140.420886
[JR]函館本線(函館~長万部) 野田生                      42.217104 140.37586
[JR]函館本線(函館~長万部) 山越                         42.231172 140.326593
[root@fedora7 c]#

続きを読む "C言語でMySQLを操作する" »

2008年01月12日

全国の路線・駅一覧とgoogle mapのコラボ

全国の路線・駅一覧とgoogle mapを組み合わせてみました。

http://www.iplusone.co.jp/service/STATION/station_map5.php

社内Fedora7環境で作っていたものを
弊社ホスティングサイトへ移行したときのメモを残しておきます。

基本的に、文字コードのお話

Fedora7からutf8になり、PHPも、MySQLもutf8と楽チンになったのだけれど
ほかの環境ではそうはいきません。

まだまだEUCなサイトは多いです。
移行の手順は次の通りです。

(1) mysqldumpでutf8でダンプする。
(2)ダンプしたファイルをEUCに変換
(3)移行先に、テーブルをEUCで作成&データも文字コードEUCで流し込む

これで、データは完成。

次にプログラムの変更

(1)PHPも、EUCにコード変換
(2)テーブルから取得した文字コードは、EUCなので、EUC→utf-8へ変換が必要

 mb_convert_encoding(変数,"UTF-8","EUC-JP")


(3)google map APIは、utf-8でないと使えないのでscriptで文字コードを指定する

<script src="http://maps.google.com/maps?file=api&v=2&key=....." type="text/javascript"></script>

ここの部分に、次のようにcharasetを指定する。


<script src="http://maps.google.com/maps?file=api&v=2&key=....."
type="text/javascript" charset="utf-8"></script>

2008年01月16日

一方のテーブルに存在して、一方のテーブルには存在しないレコードの確認

一方のテーブルに存在して、一方のテーブルには存在しないレコードの確認。

これをOUTER JOINでやってみる。
どれくらい時間がかかるのか。

mysql> select t1.CODE from M_RAIL t1 LEFT OUTER JOIN M_STATION t2 ON t1.CODE = t2.CODE WHERE t2.CODE IS NULL ;
+---------+
| CODE |
+---------+
| 0101032 |
| 0101033 |
| 0101081 |
| 0101091 |
| 0101101 |
| 0101111 |
| 0101121 |
| 0103021 |
| 0103031 |
| 0103041 |
| 0104011 |
| 0104021 |
| 0201011 |
| 0403011 |
| 2104011 |
| 2701093 |
| 2104011 |
+---------+
17 rows in set (1 min 17.40 sec)

OUTER JOINは INNER JOINと違い、条件に一致しなかったレコードも含めて結合します。
LEFT OUTER JOINは、左外部結合なので、左を基準に、右オペランドのテーブルから
一致するレコードがない部分はNULL値で埋められます。
上のSQLでは、路線テーブル(M_RAIL)にあって、駅テーブル(M_STATION)にないレコードの路線コードを表示しています。

路線名も出力します。

mysql> select t1.CODE, t1.NAME_KANJI from M_RAIL t1 LEFT OUTER JOIN M_STATION t2 ON t1.CODE = t2.CODE WHERE t2.CODE IS NULL ;
+---------+-------------------------------------+
| CODE | NAME_KANJI |
+---------+-------------------------------------+
| 0101032 | [JR]根室本線 |
| 0101033 | [JR]根室本線 |
| 0101081 | [JR]留萌本線 |
| 0101091 | [JR]富良野線 |
| 0101101 | [JR]宗谷本線 |
| 0101111 | [JR]石北本線 |
| 0101121 | [JR]釧網本線 |
| 0103021 | [札幌市営]南北線 |
| 0103031 | [札幌市営]東豊線 |
| 0103041 | [札幌市電]山鼻線 |
| 0104011 | [函館市電]2系統 |
| 0104021 | [函館市電]5系統 |
| 0201011 | 津軽鉄道 |
| 0403011 | [仙台空港鉄道]仙台空港線 |
| 2104011 | 神岡鉄道 |
| 2701093 | [JR]北陸本線 |
| 2104011 | 神岡鉄道 |
+---------+-------------------------------------+
17 rows in set (1 min 17.28 sec)

About MySQL

ブログ「iPLUSONE Blog」のカテゴリ「MySQL」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはMovable Typeです。

次のカテゴリはPHPです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.34