KIC

KICのメモ帳  古い記事には、とんでもない嘘間違った情報が書かれている場合がありますので注意してください。

全国の市区町村名データベースをデータベースに取りこむ。

郵政公社だった頃のメモがでてきたのでうp

日本全国の市区町村名をデータベース化してみる。

郵政公社のWebページに行くと、住所と郵便番号の対応させたデータベースって言うのがある。これが、csv形式のデータで提供されている。

以下のページより、全国一括のファイルをダウンロード
http://www.post.japanpost.jp/zipcode/dl/oogaki.html

落としたら解凍。

CSV形式のファイルなので、そのままデータベースに投入することもできる。

ファイルの一行目はこんな感じになっている。↓
01101,"060 ","0600000","ホツカイドウ","サツポロシチユウオウク","イカニケイサイガナイバアイ","北海道","札幌市中央区","以下に掲載がない場合",0,0,0,0,0,0

3カラム目が郵便番号
7カラム目が都道府県名
8カラム目が市区町村名
9カラム目に細かい地名

全国の市区町村名が必要なわけだから、7と8カラム目があればOKっぽい。
群馬県にあった東村みたいに同一県内に同一名称の市町村が複数存在していることもあるかもしれないので、郵便番号を主キーにしてみる。(9カラム目は使わない)

※平成の大合併で東村はすべて廃止になりました。

最大で3階層から成るカテゴリ構造を扱うデータベース再構築メモ

就活の最中にちょちこちょこと作っていたシステムのデータベース設計を失敗したので作り直す。

データベースで扱う文字コードはsjis
リレーション名はcategory
リレーションスキーマは
category(cID,cName,cTop,cMiddle,cBottom,ruling)

で、DB作ってテーブル作るまでのSQLは以下の通り。 mysql> create database dbName character set sjis ; Query OK, 1 row affected (0.00 sec) mysql> use dbName ; Database changed mysql> create table category(cID int not null,cName char(80),cTop char (80),cMiddle char(80),cBottom char(80),ruling char(3),primary key(cID)) ; Query OK, 0 rows affected (0.00 sec) mysql> show fields from category ; +---------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+----------+------+-----+---------+-------+ | cID | int(11) | NO | PRI | | | | cName | char(80) | YES | | NULL | | | cTop | char(80) | YES | | NULL | | | cMiddle | char(80) | YES | | NULL | | | cBottom | char(80) | YES | | NULL | | | ruling | char(3) | YES | | NULL | | +---------+----------+------+-----+---------+-------+ 6 rows in set (0.00 sec)

リレーション名がカテゴリだけど、実際はカテゴリ構造とカテゴリ名とそのIDのリレーション
一応、第一正規形になってると思うのだが、このままだと様々な異状が発生するらしいので本当は高次の正規化、第三正規形までしないとだめらしい。

ちなみに、このテーブルには以下の様なクエリを使ってデータを投入する。 insert into category values(2078297648,"暗号と認証", "コンピュータテクノジー","セキュリティ","暗号と認証","小") ;

カテゴリリレーションを作るときのメモ

上記の実質カテゴリ構造+カテゴリ名リレーションをカテゴリ構造リレーションとカテゴリ名リレーションに分割するときには、カテゴリ名が重複する可能性があるために、カテゴリ名を主キーやユニークキーにすると重複が発生し問題あり。

外部からMySQLサーバに接続できない件について

稼動しているMySQLサーバに外部のコンピュータより接続を試みた。しかし、接続できない。

root@localhost

すっかり、忘れていた。
立てたばかりのサーバに外部PCから接続しようと考えていたのだが、この場合サーバへ接続する際のユーザは「root@localhost」ではなく「root@172.24.25.99」になってしまう。
※172.24.25.99は外部PCのIPアドレス

立てたばかりのMySQLのデータベースmysqlのuserテーブルのuserとHostの値をみると以下のようになっていて・・・

mysql> use mysql Database changed mysql> select user,Host from user ; +------+-----------+ | user | Host | +------+-----------+ | root | localhost | +------+-----------+ 1 row in set (0.00 sec)

localhost以外からの接続はダメ
というわけで、すべての権限をもつユーザを作ってみた。

mysql> grant all privileges on *.* to -> USERNAME identified by 'PASSWORD' ; Query OK, 0 rows affected (0.14 sec) mysql> select user,Host from user ; +----------+-----------+ | user | Host | +----------+-----------+ | USERNAME | % | | root | localhost | +----------+-----------+ 2 rows in set (0.00 sec)

DATETIMEの差 - MySQLのメモ

なにをしたいかというと、時間-時間を求めたいわけだ。

以下のような表があるとする(jikanの型はDATETIME)
mysql> select * from t1 ; +------+---------------------+ | id | jikan | +------+---------------------+ | 1 | 2006-12-10 12:50:00 | | 2 | 2006-12-17 12:55:00 | | 3 | 2006-12-17 21:55:50 | | 4 | 2006-12-17 21:27:30 | | 5 | 2006-12-17 21:29:31 | +------+---------------------+

idが5であるタップルの時間と現在の時間の差を求めたいとき、TIMEDIFF()という関数を使えばいい。(TIMEDIFF()関数はMySQL 4.1.1以降じゃないと使えない )


↓使用例
mysql> select timediff(now(),(select jikan from t1 where id=5)) as 'id5-now',now() ; +----------+---------------------+ | id5-now | now() | +----------+---------------------+ | 00:03:32 | 2006-12-17 21:33:03 | +----------+---------------------+ 1 row in set (0.00 sec)

↑現在の時刻をnow()を使ってだして、(select jikan from t1 where id=5)でidが5の時刻を求める。んで、これらの値をtimediff()関数に入れると、計算される。

BLOB型及びTEXT型を主キーにする | MySQL

MySQLでTEXT型な属性を主キーにしようとしていたら、以下のようなメッセージが出て怒られてしまった。

ERROR 1170 (42000): BLOB/TEXT column 'ID' used in key specification without a key length

BLOB型やTEXT型な属性を主キーにする場合は、キーの長さを指定してやらなくてはいけないらしい。

たとえば、属性が(ID,名前,性別,年齢)からなるテーブルを作るとする(下線が引いてあるのは主キー)主キーとなるIDの型はTEXT型。

以下のように、主キーの長さを指定してやる。
create table user(ID text not null,名前 char(50),性別 char(3) , 年齢 int , primary key(ID(128))) ;


ちなみに上記のクエリだと以下のようなテーブルができる。
mysql> show fields from user ; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | ID | text | NO | PRI | | | | 名前 | char(50) | YES | | NULL | | | 性別 | char(3) | YES | | NULL | | | 年齢 | int(11) | YES | | NULL | | +-------+----------+------+-----+---------+-------+

MySQL4.1以上の壁 メモ

MySQL4.1の壁については日本MySQLユーザ会のFAQに書かれている。

MySQLのサーバのキャラクターセットがUTF-8
クライアントのキャラクターセットもUTF−8
にして、MySQL5.0.26を入れてみた。

んで、Windowsのコマンドプロンプトからサーバに接続して、マルチバイト文字を含んだクエリをしてみたら、どうも上手くいかない。どうやら、文字コードが自動で変換されてしまう上に文字化けが発生しているために上手くいかないようだ。

というわけで、MySQL4.1の壁にぶつかった。

そもそも、今回立てたMySQLサーバはJAVAで作ったアプリケーションからデータを入れたり出したりする為のもので、この出し入れが問題なければOKというはずなんだけど、Windowsのコマンドプロンプトからもデータを見たかったり、その他いくつかの環境からも見る予定だったので、どうしようかと。

とりあえず、JAVAからのデータの出し入れに関してはこのままでOK。
その他、クライアントからは、たとえばWindowsからであるならば

mysql> SET NAMES sjis;

みたいな、コマンドを入力して一回一回文字コードを指定してやることにした。

 | HOME | 

カレンダー

« | 2008-08 | »
S M T W T F S
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -

過去の記事

カテゴリ

最近の記事

コメント

トラックバック

Appendix

kics

kics

FC2ブログへようこそ!

無料ホームページ アフィリエイト レンタルサーバーFC2ブログ 一戸建て

メール:kic_weblog@yahoo.co.jp