標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

SQL-Bless 製作中に把握が必要になった各DBの違い(随時更新)

共通

  • 型名は DB ごとにばらばらだが、ANSI SQL の型がエイリアスになっている模様
    • 可変長文字列型 → CHARACTER VARYING(n)
    • 数値型 → NUMERIC[(n)]

Oracle Database 21 Express Edition

  • コマンドラインクライアントによるデフォルトインスタンスへのログインは
    sqlplus system/(インストーラーで設定したパスワード)@xe
  • インスタンスの起動・停止はスタートメニューの Oracle Instance Manager より(OS Boot の際、自動的に起動される)
  • SQL*Plus の中で、テーブルの仕様を確認するコマンドは desc テーブル名、テーブル一覧を保有する簡単なテーブル(もしかしたらビューかも)として TAB がある
    • 列の詳細はテーブル all_tab_columns で確認できる
  • Go言語のドライバーとして、今回は https://github.com/sijms/go-ora を使用
    • 接続文字列の仕様は oracle://ユーザ名:パスワード@ホスト名:1521/xe
  • 位置指定のプレースホルダーは :1, :2,…
  • 日時型は二種類
DatabaseTypeName() ScanType().String()
NCHAR string
NUMBER float64

PostgreSQL

  • scoop install postgresql だけでインストールできた。さすが OSS
  • コマンドラインクライアントによるデフォルトインスタンスへのログインは
    psql "host=127.0.0.1 port=5432 user=postgres dbname=postgres sslmode=disable"
  • インスタンスの起動・停止は pg_ctl start / pg_ctl stop
    (OSブートで勝手に立ち上がらなかった。よし)
  • PostgreSQL ではトランザクション内でエラーが一度でも起きると、以後、ロールバックを行うまで、ずっとエラーになる1
  • psql の中で、テーブルの仕様を確認するコマンドは \d テーブル名、テーブル一覧は \d で確認できる
    • 詳細を確認は pg_attribute(テーブルの列情報)、pg_class(テーブルの名前などの情報)、pg_type(データの型情報)などのテーブルを参照する。
  • Go言語のドライバーとして、今回は https://github.com/lib/pq を使用
    • 接続文字列の仕様は(例) host=127.0.0.1 port=5432 user=postgres dbname=postgres sslmode=disable
  • 位置指定のプレースホルダ―は $1, $2
  • 日時型は3種類2
    • timestamp - 日付時刻
    • date - 日付のみ時刻なし
    • time - 時刻のみ日付なし
DatabaseTypeName() ScanType().String()
NAME interface{}
INT2 int16
INT4 int32
BOOL bool
_TEXT interface{}
VARCHAR string
NUMERIC interface {}
DATE,TIME,TIMESTAMP time.Time

Microsoft SQL Server

DatabaseTypeName() ScanType().String()
NVARCHAR string
INT int64
DATETIME time.Time
BIT bool
CHAR string
DECIMAL []uint8
VARCHAR string

MySQL

  • scoop install mysql だけでインストール可能
  • コマンドライン栗案とは mysql
    • データベースへの接続は mysqluse データベース名
    • データベースは create database データベース名 だけで作れる
  • インスタンスの起動は mysqld --standalone 。停止は Ctrl-C で、いいのかな
  • Go言語のドライバーとして https://github.com/go-sql-driver/mysql を使用
  • テーブル一覧は information_schema.tables、カラム一覧は information_schema.columns
  • 接続文字列は username:password@protocol(address)/dbname?param=value だが、デフォルトなら root:@/dbname でいける(dbnamemysqlshow databases で確認できる)
  • 日時型は、 DATE: 日付のみ, DATETIME: 日付+時刻, TIMESTAMP: エポック秒, TIME: 時刻, YEAR2: 2桁年(なぜ), YEAR4: 4桁年(なぜ)。時刻はマイクロ秒単位
  • 日時変換関数は独特
DatabaseTypeName() ScanType().String()
DECIMAL sql.RawBytes
VARCHAR sql.RawBytes

  1. おせっかいの変態仕様め
  2. 厳密にはタイムゾーンの有無もあったりするが、SQL-Bless では、そこまで関与しないことにした
  3. SQL Server 認証にするのは簡単だが、後々、プログラムのサポートでWindows 認証でログインできないという問い合わせが来たときに調べなければいけないことを考えると、今調べておいた方がよいと考えた。