Profileyoukey spacesBlogLists Tools Help

Blog


    November 08

    MySQLの誤検索

    MySQLは日本語の検索で誤検索するんですね。
    聞いたところによると有名な話だとか。
     
    「一」を検索すると「三」がヒットするし、
    「高知」を検索すると「香川」がヒットするし。
     
    他にもありそうですね。
    これは仕方がないのでしょうか。
    MySQLの仕様ということで済ませてしまおうかな。。
    September 17

    フィールドを追加する(MySQLとPostgreSQL)

    すでに運用中のWebアプリですが、ユーザ要望を反映して、フィールドを追加
    することになりました。ここで、MySQL と PostgreSQL の違いを知ることに・・・。
     
    MySQLは好きな位置にフィールドを挿入できるのですが、
    PostgreSQLは最後尾に追加することしかできないようです。
     
    【コマンド】
     MySQL    :alter table テーブル名 add 列名 データ型 first|after 列名
     PostgreSQL:alter table テーブル名 add 列名 データ型
     
    PostgreSQLの方にあわせておけば、MySQLでも使えます。
    ですので、不本意ながら(?)フィールドは最後尾に追加することにしました。
    September 15

    フィールド名の大文字/小文字

    今PHPで作ってるWebアプリは、DBはMySQLとPostgreSQLのどちらでも
    よいようにPHPLIBを使って作っています。
    ところが、MySQLだとデータを表示するのにPostgreSQLだと表示しないと
    いう問題が発生しました。
     
    【現象】
     データベースからデータを取得するコードで、MySQLだとデータが取得
     できるが、PostgreSQLだと取得できない。(日本語になってる?)
     
    【原因】
     フィールド名に大文字と小文字が混在するものがありました。
      ・MySQLはCREATE TABLE で定義したフィールド名になる
      ・PostgreSQLは常に小文字になる
     SQLでアクセスする場合は大文字と小文字の違いは無視されるので問題
     ないのですが、PHPでデータベースからデータをフェッチするときはどうやら
     大文字と小文字を区別するようです。(確信はありませんが)
     
    【対策】
     プログラム中でMySQLとPostgreSQLのどちらを使っているかを判断して
     フィールド名を切り替えるようにしました。
     例:こんな感じかな↓
       if (MySQLの場合) {
          $field_name = "FieldA";
       }
       else if (PostgreSQLの場合) {
           $field_name = "fielda"; 
          }
           else {
          $field_name = "FieldA";
          }        
     
     
    フィールド名は大文字と小文字が混在しないようにしましょう。なーんて。 
    まだまだわからないことが多いです。。
    以上、覚書でした。
    September 08

    text型の数値の並べ替え

    覚書です。
    text型のフィールドに数値を入力して昇順で並べ替えると 
      1 → 11 → 2 → 20 → 3
    となっちゃうんですよね。
    そんなとき、CASTを使うと数値順に並べ替えられます。
     
     サンプル: ORDER BY  CAST(id AS UNSIGNED);
     
    ただ、MySQLとPostgreSQLでは指定できる型が異なるようです。
    <<MySQL>>
     BINARY
     CHAR
     DATE
     DATETIME
     SIGNED {INTEGER}
     TIME
     UNSIGNED {INTEGER}

    <<PostgreSQL>>
     int4 など

    【注意】
     PostgreSQLでは、""をintegerにキャストするとエラーになります。
     (キャストするフィールドに値がはいっていなければエラーになります)
      メッセージ:Invalid syntax input integer: ""
    【参考】
     ここ↓を参考にさせていただきました。
    September 06

    次の記事について :MySQL と Postgres の文の違い

    以前覚書で書いたものですが、今日、別のことを調べてて

    PostgreSQL との互換性を確保するため、MySQL では LIMIT row_count OFFSET
    offset 構文もサポートしている。

    というのを知りました。ちょっとショック。。

    ここ↓を拝見しました。

    http://www.hostgeekz.com/docs/mysql/japanese/manual.ja_Reference.html

     

     元の記事からの引用

    MySQL と Postgres の文の違い

    今、『PHP+MySQL』で動作するシステムの「MySQL」を「Postgres」に変えるという作業をしています (というか、両方に対応できるように改訂しています)。 その作業中に気付いたことをメモしていきます。

    1.LIMIT
     MySQLとPostgresでは少し書き方が違います。
      [MySQL  ] LIMIT start, count
      [Postgres] LIMIT count  OFFSET start
    例えば、先頭から3レコードだけを取り出したい場合は次のようになります。
      [MySQL  ] SELECT * FROM table LIMIT 0,3;
      [Postgres] SELECT * FROM table LIMIT 3 OFFSET 0;

    2.GROUP BY
     MySQLでは「非表示のフィールドに対する GROUP BY」ができます。これはMySQLの拡張機能であって、標準SQLにはありません。
    例えば、code というフィールドでグループ化する場合は次のように書けます。
      [MySQL  ] SELECT * FROM table GROUP BY code;   ←PostgresではNG
      [Postgres] SELECT code FROM table GROUP BY code;

    3.GRANT
     MySQLでは、テーブルすべてを対象にできるようですが、Postgresではテーブルをひとつずつ指定しなければならないようです。(やり方を知らないだけかも...)
      [MySQL  ] 
    GRALT ALL PRIVILEGES ON *.* to db_user@localhost IDENTIFIED BY 'password';
      [Postgres] GRANT ALL ON table TO db_user;

    なるべく拡張機能を使わないようにしたいものです。

    August 27

    破損したテーブルの修復(active_sessionsのとき)

    覚書の続きです。
    active_sessionsテーブルは、repair table では修復できないと
    連絡がありました。こうなったら最後の手段・・・?
     
     
    【現象】
     Webブラウザでシステムにアクセスするとエラーメッセージが出る。
     
      ・MySQL Error: 1034 (Incorrect key file for table: 'active_sessions'. Try to repair it) Session halted.
      ・MySQL Error: 1016 (Can't open file: 'active_sessions.MYD'. (errno: 145))
    Session halted.
     
    【原因】
     これ↓です。

     
    【修復方法】
     ■ 手順とコマンド
      (1)データの保存先 data\mydb にある3つのファイルの名前を変更します。
          active_sessions.frm
          active_sessions.MYD
          active_sessions.MYI
      (2)MySQLを起動して、データベースを指定します。
          C:\>mysql -u root -p
          Enter password: **** 
      (3)active_sessionsテーブルを作成し直します。
          mysql> CREATE TABLE active_sessions (
               ->    sid varchar(32) DEFAULT '' NOT NULL,
                   ---(省略)---
                );

    【ひと言】
     テーブルを一部だけ置き換えるのはどうかな?と思ったのですが、
     セッション管理用のテーブルだから問題ないと思って。
     まあ、問題なく動いてるとのことだからよしとしてください。
     

    破損したテーブルの修復(active_sessions以外)

    久々に覚書です。
    ユーザさんのところで、ここのところネットーワークの調子が悪い
    らしくサーバーが2度ほどダウンしたとか。
    その後システムにアクセスするとエラーメッセージが出て使えない
    との連絡がありました。
     
    【現象】
     Webブラウザでシステムにアクセスするとエラーメッセージが出る。
     
      ・MySQL Error: 1030 (Got error 127 from table handler) Session halted.
     
    【原因】
     これ↓です。

     
    【修復方法】
     ■ 手順とコマンド
      (1)MySQLにログインします。
         C:\>mysql -u root -p
         Enter password: ****
      (2)テーブルが破損していないかチェックします。
         mysql> check table t_table extended;
      (3)(2)で「Msg_type」にerrorがある場合、テーブルを修復します。
         mysql> repair table t_table;

     ■操作例
     C:\>mysql -u root -p
     Enter password: ****
     Welcome to the MySQL monitor.  Commands end with ; or \g.
     Your MySQL connection id is 7 to server version: 4.0.22-nt

     Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

     mysql> use mydb
     Database changed

     mysql> check table t_table extended;
     +---------------+-------+----------+----------+
     | Table         | Op    | Msg_type | Msg_text |
     +---------------+-------+----------+----------+
     | mydb.t_table  | check | error    xxx      | 
     +---------------+-------+----------+----------+
     1 row in set (0.02 sec)

     mysql> repair table t_table;
     +---------------+--------+----------+----------+
     | Table         | Op     | Msg_type | Msg_text |
     +---------------+--------+----------+----------+
     | mydb.t_table  | repair | status   | OK       |
     +---------------+--------+----------+----------+
     1 row in set (0.01 sec)

     mysql>
     
    【ひと言】
     
    April 05

    MySQL と Postgres の文の違い

    今、『PHP+MySQL』で動作するシステムの「MySQL」を「Postgres」に変えるという作業をしています (というか、両方に対応できるように改訂しています)。 その作業中に気付いたことをメモしていきます。

    1.LIMIT
     MySQLとPostgresでは少し書き方が違います。
      [MySQL  ] LIMIT start, count
      [Postgres] LIMIT count  OFFSET start
    例えば、先頭から3レコードだけを取り出したい場合は次のようになります。
      [MySQL  ] SELECT * FROM table LIMIT 0,3;
      [Postgres] SELECT * FROM table LIMIT 3 OFFSET 0;

    2.GROUP BY
     MySQLでは「非表示のフィールドに対する GROUP BY」ができます。これはMySQLの拡張機能であって、標準SQLにはありません。
    例えば、code というフィールドでグループ化する場合は次のように書けます。
      [MySQL  ] SELECT * FROM table GROUP BY code;   ←PostgresではNG
      [Postgres] SELECT code FROM table GROUP BY code;

    3.GRANT
     MySQLでは、テーブルすべてを対象にできるようですが、Postgresではテーブルをひとつずつ指定しなければならないようです。(やり方を知らないだけかも...)
      [MySQL  ] 
    GRALT ALL PRIVILEGES ON *.* to db_user@localhost IDENTIFIED BY 'password';
      [Postgres] GRANT ALL ON table TO db_user;

    なるべく拡張機能を使わないようにしたいものです。

    February 01

    MySQLを狙う“ボット”出現

    ●MySQLを狙う“ボット”出現、管理者パスワードを破って感染する (日経BP社 2005年1月29日)

    このワームは、「MySQLの管理者(root)アカウントに弱いパスワードを設定している場合に感染する」そうです。
    対象はWindowsマシンだけで、UNIXとLinuxマシンは感染しないとか。
    キャッシュカードの暗証番号と同じく、パスワードは推測しにくいものにしましょう。

    最近、自分の携帯電話がウイルス感染する夢を2回も見てしまって、ウイルスやワームに安眠妨害されています。日本ではまだ携帯がウイルスに感染したという事例はないそうですが、海外ではノキアの携帯で感染事例があるとか。汎用OSが使われるようになると脅威も増しますね。そのうちネット家電もウイルス対策が必要になるのでしょうか...。

    November 22

    MySQLのライセンス

    またまた覚書です。MySQLのライセンスを注文してみました。

    ●ライセンスの種類
    1.コマーシャルライセンス
     配布するアプリケーションをオープンソース/フリーソフトとして引き渡したくない場合のライセンス
     (MySQL Classic コマーシャルライセンス 35,490円(税込) ←2004/11/22現在)

    2.オープンソースライセンス
      配布するアプリケーションの全ソースコードが妥当な条件で利用でき、自由に再配布することが可能でなければならない (配布アプリケーションが100% GPL準拠である必要あり)

    ●注文
    商用で利用する場合にはコマーシャルライセンスが必要です。
    株式会社ソフトエイジェンシーさんが日本公認代理店をされているので、そちらから注文書をダウンロードして注文するか、オンラインで申し込みます。(注文:
    http://www.softagency.co.jp/order/

     
    ★今回は注文書をダウンロードしてFAXしました。即日請求書発送と、とてもすばやい対応をしてくださいました。

    ●参考
     ◎ライセンスポリシー
      http://www.softagency.co.jp/mysql/licensing.html
     ◎ライセンス早分かり
      http://www.softagency.co.jp/mysql/license.html
     ◎価格
      http://www.softagency.co.jp/order/index.html

     

    October 05

    データのバックアップ(MySQL)

    またまた覚書です。

    ●データのバックアップ
    c:\>cd \mysql\bin
    c:\>mysqldump -u root -pパスワード  データベース名 > バックアップファイル名

    ●データのリストア
    c:\>cd \mysql\bin
    c:\>mysql -u root -pパスワード  データベース名 <
    バックアップファイル名

    August 28

    ビープ音を消す

    コンソールでMySQLを使っていると、コマンドを間違えるたびに"ビーッ"と音がでます。1コマンドだけならよいのですが、テキストファイルにコマンドを記述してこれを読み込んだ時にコマンドを間違えていると"ビーッビーッビーッビーッビーッビーッ"と鳴りっぱなし。これでは周りに迷惑なのでビープ音を消しましょう。
    (わたしはデータベースを選択するのを忘れてテキストファイルからコマンドを読み込んでよくビービー言われました)

    ビープ音を消す方法
    1. コントロールパネル[システム]をダブルクリックします。
    2. [ハードウエア]タブを選択します。
    3. [デバイスマネージャー]ボタンをクリックし、デバイスマネージャを開きます。
    4. [表示]メニューの[非表示のデバイスを表示]を選択します。
    5. [プラグ アンド プレイではないドライバ]の[+]をクリックして展開します。
    6. [Beep]上でマウスを右クリックし、ショートカットメニューから[プロパティ]を選択します。
    7. [ドライバ]タブを選択します。
    8. [スタートアップ]の[種類]に"無効"を選択します。
    9. [OK]ボタンをクリックします。

    これでビープ音は消えたはず。

    August 25

    MySQLのコマンド

    おぼえがきです。

    ●フィールドの追加
    mysql>use データベース名
    mysql>alter table テーブル名 add フィールド名 フィールド定義  [first | after フィールド名];

    ●フィールドの削除
    mysql>use データベース名
    mysql>alter table テーブル名 drop フィールド名;

    ●テーブルをエクスポート
    mysql>use データベース名
    mysql>select * from テーブル名 into outfile 'c:\text.txt';

    ●rootユーザのパスワードの変更
    mysql>UPDATE user SET Password=password('新パスワード') WHERE User='root';
    mysql>quit

    c:\>mysqladmin -u root -p reload [ENTER]
    Enterpassword: 旧パスワード

    ●テーブルの削除
    mysql>use データベース名

    mysql>drop table テーブル名;

    ●テーブル名の変更
    mysql>use データベース名

    mysql>alter table 現テーブル名 rename as 新テーブル名;

    ●フィールド名の変更
    mysql>use データベース名

    mysql>alter table テーブル名 change 旧フィールド名 新フィールド名 フィールド定義;

    August 24

    MySQLのデータ保存場所を変更する

    おぼえがきです。

    MySQLのデータ保存場所は、デフォルトではインストールしたフォルダ下のdataフォルダです。
    これを変更したいという問い合わせがありました。変更はとても簡単です。

    ■変更手順■
    1.MySQLをインストールしたフォルダ下の dataフォルダ(下位フォルダ含む)を新規データ保存場所に
     コピー(または移動)します。(dataフォルダ下のmysqlフォルダは必須)

       例:新規データ保存場所が c:\newdir\ の場合
         c:\newdir\data\
         c:\newdir\data\mysql\

    2.c:\windows フォルダ下の my.ini ファイルを編集します。my.ini の datadir に新規データ保存場所
     を指定します。

        例:datadir=C:/newdir/data

    3.MySQLを再起動します。
      (1)Windowsのコントロールパネルの[管理ツール]の[サービス]をダブルクリックします。
      (2)MySQL上でマウスの右ボタンをクリックし、ショートカットメニューから[再起動]を選択します。

     以上で変更終了です。