imgres

PostgreSQLでMySQLのようなAUTO_INCREMENTをしたいとき。

PostgreSQLでMySQLのようなAUTO_INCREMENTをしたいとき。

MySQLで自動的な連番を格納するカラム(シリアル)を作りたいとき、AUTO_INCREMENTを対象カラムに設定します。
PostgreSQLでは、設定やオプションではなくserial型としてデータ型が準備されています。

PostgreSQL

create table sample (
  id SERIAL,
  valeu integer
) ;

MySQL

create table serial_sample (
  id int AUTO_INCREMENT,
  valeu INT
);

以上です。

また、データベースを構築するときはは、フリーソフトの「A5:SQL Mk-2」が便利なのでお勧めです。
ER図やDDLを作るときも欠かせません。

A5M2でのサンプルをおいておきます。 (右クリックで保存してください)
PostgrSQL SERIAL A5M2 – サンプルファイル
MySQL AUTO_INCREMENT A5M2 – サンプルファイル

MySQL/PostgreSQLでのシリアル値まとめ – adiary開発日誌

シーケンス操作関数(PostgreSQL 9.3.2文書)

ruby

rubyでformを取得する【サンプル】

railsのようなフレームワークを使わずに、ruby単体でform(リクエスト)情報を取得する方法です。

現在のバージョン ruby 2.1 で動作確認を行っております。

rubyでformを取得する

cgiクラスを読込んで、cgi.newするだけで使えるので簡単です。
簡単ですが、少し気を付けたい点です。
・postもgetも、同じコードで取得できるので、意図しないgetに注意する。
・checkboxやname名が同じ要素等は、配列として渡されます。params(ハッシュに変換するメソッド)を使用してアクセスすると便利です。
・escapeHTMLメソッドで、エスケープする(XSS:クロスサイトスクリプティング対策)。

もちろん、実際に使用するときは、入力値のバリデーションも行いましょう。

require "cgi"
cgi = CGI.new

# リテラルの場合
# <input type="text" name="name" />
print cgi['name']

# 配列で渡される値の場合
# <input type="checkbox" name="checkbox" value="box1" />
# <input type="checkbox" name="checkbox" value="box2" />

# 個別にアクセス
print cgi.params['checkbox'][0]

# each でまとめてアクセス
objCgi.params['checkbox'].each do |i|
  print i,"<br>"
end

# エスケープ
print CGI.escapeHTML(cgi['name'])

rubyでformを取得するサンプル

railsのようなフレームワークを使わずに、ruby単体でリクエスト情報を取得するサンプルです。
rubyでformを取得する【サンプル】
#!/xxxx/lib/ruby の部分は環境に合わせて変更してください。

#!/xxxx/lib/ruby

require "cgi"
objCgi = CGI.new

# リクエストを、エスケープし, 文字列は文字列化, 数値は数値化
# objCgi : CGIインスタンス
# arrkeys : 配列のキー(チェックボックス等)
def requestParse(objCgi, *arrkeys)
  
  require "cgi"
  hashResult = Hash.new
  
  arrRequestKeys = objCgi.keys
  
  arrRequestKeys.each do |key|
    if (arrkeys.index(key) == nil) then
      temp = CGI.escapeHTML(objCgi[key].to_s.strip)
      if ( /^([0-9])+$/ =~ temp ) then
        temp = temp.to_i
      end
    else
      # 配列の時
      arrValue = objCgi.params[key]
      temp = Array.new
      arrValue.each do |value|
        val = CGI.escapeHTML(value.to_s.strip)
        if ( /^([0-9])+$/ =~ val ) then
          val = value.to_i
        end
        temp << val
      end
    end
      hashResult[key] = temp
  end
  
  return hashResult 
end

# リクエスト(post,get)と、配列のネームを渡します。
arrRequests = requestParse(objCgi, "checkbox", "checkbox2")

# チェックボックス判定
def checkflag(array, value)
  check = ""
  if (array.class == Array and array.index(value) != nil) then
      check = "checked"
  end
  return check;
end

print <<"HERE"
Content-Type: text/html

<!DOCTYPE html>
<html lang="ja" xml:lang="ja">
<head>
    <meta charset="UTF-8">
    <title>rubyでformを取得する【サンプル】</title>
</head>
<body>
<form action="#" method="post">
    <p>name : val1</p>
    <input type="text" name="val1" value="#{arrRequests['val1']}" />
    <p>name : val2</p>
    <input type="text" name="val2" value="#{arrRequests['val2']}" />
    <p>name : radio</p>
    <input type="radio" name="radio" value="radio1" #{ "checked" if arrRequests["radio"] == "radio1"} />radio
    <input type="radio" name="radio" value="radio2" #{ "checked" if arrRequests["radio"] == "radio2"} />radio2
    <input type="radio" name="radio" value="radio3" #{ "checked" if arrRequests["radio"] == "radio3"} />radio3<br />
    <br />
    <p>name : checkbox</p>
    <input type="checkbox" name="checkbox" value="momo" #{checkflag(arrRequests["checkbox"], 'momo')} />momo
    <input type="checkbox" name="checkbox" value="hana" #{checkflag(arrRequests["checkbox"], 'hana')} />hana
    <input type="checkbox" name="checkbox" value="kuri" #{checkflag(arrRequests["checkbox"], 'kuri')} />kuri
    <input type="checkbox" name="checkbox" value="2929" #{checkflag(arrRequests["checkbox"], 2929)} />2929<br />
    <br />
    <p>name : checkbox2</p>
    <input type="checkbox" name="checkbox2" value="1" #{checkflag(arrRequests["checkbox2"], 1)} />1
    <input type="checkbox" name="checkbox2" value="2" #{checkflag(arrRequests["checkbox2"], 2)} />2
    <input type="checkbox" name="checkbox2" value="3" #{checkflag(arrRequests["checkbox2"], 3)} />3
    <input type="checkbox" name="checkbox2" value="4" #{checkflag(arrRequests["checkbox2"], 4)} />4<br />
    <br />
    <p>name : textbox</p>
    <textarea name="textbox" rows="10" cols="50">#{arrRequests['textbox']}</textarea>
    <br />
    <input type="submit" name="submit" value="送信" />
</form>
HERE

print "</body></html>\n"

オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル

オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル

mysql_logo

MySQLの型 抜粋

よく使うMySQLのデータ型を記載しましたが、それ以外の選択肢として「個人的にこの中から選べばいいかな?」と言うデータ型を抜粋しました。

MySQLの型の抜粋

数値型

・INT型
バイト : 4
範囲 : -2147483648 ~ 2147483647
   : 0 ~ 4294967295

・BIGINT型
バイト : 8
範囲 : -9223372036854775808 ~ 9223372036854775807
   : 0 ~ 18446744073709551615

固定小数点型(アンパック浮動小数点型)

・DECIMAL(デシメル)型
DECIMAL(M,D)
・DECIMAL(20, 10) は、整数部10桁、小数部10桁の合計20桁
・M は最大桁数(精度)。1から65(桁)までの範囲が指定できる。
・D は少数点の桁数。0から30までの範囲がつかえて、D < M でないといけない。
・数値計算が65桁は正確(float型みたいな誤差がない)
・計算コストが高い(遅いらしい)

注) DECIMAL型は、MySQLのバージョンによって違いがあるみたいです(↑は5.1のマニュアルより)。古いバージョンの MySQL では、1から254までの範囲

文字列型

・CHAR型
固定長
CHAR(M) : Mは255文字まで

・VARCHAR型
可変長
VARCHAR(M) : Mは文字数を指定、最大0から65,535バイトまでを指定できる。utfj8mb4の場合、1文字4byteなので、Mの最大値は16,384(調査していないので、実際値ではないと思います。)

・TEXT型
最大長は 65,535バイト
TEXT型はVARCHAR型でバイト数を指定しなかったものと考えてよいそうです。utfj8mb4の場合、16,384文字ぐらい?
TEXT型で足りないときは、MEDIUMTEXT(16,777,215バイト),LONGTEXT(最長4,294,967,295、または4GBバイト)

浮動小数点

・FLOAT型
バイト : 4
範囲 : -3.402823466E+38 ~ -1.175494351E-38, 0, 1.175494351E-38 ~ 3.402823466E+38

・DOUBLE型
バイト : 4
範囲 : -1.7976931348623157E+308 から -2.2250738585072014E-308, 0, 2.2250738585072014E-308 から 1.7976931348623157E+308

日付型と時刻型

・DATETIME型
バイト : 8
形式 : ‘0000-00-00 00:00:00’
範囲 :’1000-01-01 00:00:00′ ~ ‘9999-12-31 23:59:59’

・TIMESTAMP型
バイト : 4
形式 : ‘0000-00-00 00:00:00’
範囲 :’1970-01-01 00:00:00′ ~ ‘2038-01-19 03:14:07’

MySQL :: MySQL 5.1 リファレンスマニュアル :: 22.2 DECIMAL データ タイプの変更

MySQLのデータ型 – MySQLの使い方

MySQL :: MySQL 5.5 Reference Manual :: 11.3.1 The DATE, DATETIME, and TIMESTAMP Types

ruby

ruby 関数定義 メソッド引数「*」が空の時

下記の関数「foo3」について
foo3に、引数を一つ渡した場合、arrの形が知りたかったので、関数定義についてまとめました。
結果は、配列として帰ってきていました。

関数の作り方:基本

# 基本
def foo(name)
  puts name
end

# 初期値
def foo2(name = "momo")
  puts name
end

# 引数の数を不定
def foo3(a, *arr)
  print [a, arr]
end

# 引数の数を不定 ver2
def foo4(a, *arr, b)
  p a, arr, b
end


foo("hogehoge") # => hogehoge

foo2() # => momo
foo2("hogehoge") # => hogehoge

foo3(1) # => [1, []]
foo3(1, 2, 3, 4, 5) # => [1, [2, 3, 4, 5]]

# foo4(1) # エラー
foo4(1, 2, 3, 4, 5) # => [1, [2, 3, 4], 5]

関数の作り方:ハッシュ引数

# 引数にキーワード
def foo5(x: 0, y: 0, z: 0)
  print "x:", x,"  y:", y,"  z:", z
end

# 引数にキーワード(配列)
def foo6(x: 0, y: 0, z: 0)
  p x[1]
end

# 引数にキーワード(配列)
def foo7(x: 0, y: 0, z: 0, **arr)
  p [x, y, z, arr]
end


foo5(y: 2, x: 1, z: 3) # => x:1  y:2  z:3
foo5(y: 4) # => x:0  y:4  z:0

foo6(x: [5, 6]) # => 6

foo7(x: 2, v: 3, z: 4, w: 5) # => [2, 0, 4, {:v=>3, :w=>5}]

書籍 たのしいRuby 第4版

mysql_logo

mysqlについて、機能とかInnoDBとか文字コード等々

個人的にDBの中ではMySQLを使うことが多いです。しかしDB自体初めから組む機会は少ないので、良く調べてしまう事をメモします。

InnoDBとMyISAMはどっちを使う?

「とりあえずInnoDB」位の認識ですが、MySQL5.5からInnoDBがデフォルトになったみたいです。特別な理由がなければ、InnoDBで問題がないと思います

InnoDBを選び忘れて、MyISAMのままだったと言うことが無くなって、うれしいです。

InnoDBって?

・トランザクション処理ができる
・行ロック方式なのおすすめ(MyISAMはテーブルロック方式)
・チューニングは、innodb_buffer_pool_size, key_buffer_size
・バックアップしやすい

MySQL 5.6新機能

・マルチスレッド・スレーブ対応
・InnoDBで全文検索ができる
・InnoDBでNoSQLアクセスで、高速なキー・バリュー操作や、ビッグ・データ環境でのデータの高速取得が可能

その他詳細は MySQL Database 5.6の特長

文字コードは?

文字コードは「utf8mb4」
MySQLには、「utf8」と「utf8mb4」があります。MySQL 5.5.3以降ならば、utf8mb4を選択すればいいでしょう。

特徴
・utf8 → 4バイト文字列が入った場合文字化けする。
・utf8mb4 → UTF8で4バイト文字を扱える

接続照合順序

「general_ci」か、「unicode_ci」を選べばOKなようです。この2つは、文字列検索時に挙動が違います。それぞれの特徴です。

特徴
「general_ci」
・大文字小文字もマッチする。「A」で検索すると、「A,a」ともにマッチする。
・unicode_ciに比べて、文字検索が速い。

「unicode_ci」
・大文字小文字もマッチする。「A」で検索すると、「A,a」ともにマッチする。(general_ciと同じ)
・半角全角もマッチする。「A」で検索すると、「A,a,A,a」にマッチする。
・平仮名、カタカナ、濁音などもマッチする。「さ」で検索すると、「さ, ざ, サ, サ」などにもマッチする。
・general_ciに比べて、文字検索が遅い。

検索結果(select)で、無駄なマッチがない「general_ci」を選ぶ方が多いそうですが、「ドラえもん」を検索したとき、「どらえもん」 ,「ドラエモン」 ,「ドラエモン」 , 「どらエモン」にもヒットさせたいときは、「unicode_ci」を選ぶとOKです。
個人的には、「unicode_ci」をよく使います。

数値型属性のUNSIGNEDとZEROFILL

・UNSIGNED
 負の数は使えなくなるが、正の数は2倍の範囲まで使える。
 浮動小数点型(float, double)型は負の値が無くなるのみ

・ZEROFILL
 ZEROFILLを付けた場合、自動的にUNSIGNE属性になる。
 指定した桁数になるまで、0が埋まる
 例)int(4) UNSIGNED ZEROFILL で、数値12を入れると、0012になる。

データ型

データ型は様々あります。個人的に、おおむね選ぶときの基準です

数値 :int型
文字列:100文字以内なら、char(100)型、超えるなら、txet型
小数点:decimal(M,D) M:桁数,D:小数点
日時 :datetime (timestampは、2038-01-19 03:14:07秒まで)
データ型については、別記しています。

クエリの基本

SELECT * FROM table_name WHERE 条件;

DELETE FROM table_name WHERE 条件;

INSERT INTO table_name ( key1, key2, …) VALUES ( value1, value2, …);

UPDATE table_name SET key1 = value1 [, key2 = value2, …] WHERE 条件;

mysqlのcollateを使って大文字-小文字や全角-半角を無視した検索 – end0tknrのkipple – web写経開発

MySQL5.5、utf8mb4 の使用について – PHPプロ!Q&A掲示板

運用視点なMyISAMとInnoDBと。 | LexTech

MySQL :: MySQL Database 5.6