概要
主にMySQLを使用しているのですが、MSSQLを使用する機会があり詰みかけたので
MySQLとMSSQLの際で戸惑った点について記載していきます。
同名indexはDB内に一つのみ
DB内にテーブル名が複数
release
release_history
というテーブルが合って、
pk_release というINDEXを作ろうとした時に、MySQLではどちらのテーブルにも同名でINDEXを付与することができるが、
MSSQLでは行うことができない。
テーブルをコピーした時にはINDEXや権限まわりが引き継がれない
MySQLでいう
CREATE TABLE tmp_table LIKE table;
のようなことをMSSQLで実現したい。
その場合
SELECT * INTO tmp_table FROM table where 1=0;
のようなクエリでテーブル構造をコピーできる。
がINDEXや権限回りは引き継げない。
MySQLでautoincrementになっているようなカラムにINSERTできない。
MSSQLではIDENTITYが設定されているカラム(MySQLではautoincrementが設定されているイメージ)
にそのままではINSERTできない
IDENTITY INSERTをONにする必要がある
たとえば
SET IDENTITY_INSERT import_table ON
INSERT INTO ~~
SET IDENTITY_INSERT import_table OFF
のようにする。
また、セッション内でIDENTITY INSERTをonにできるのは1テーブルのみなのでoffにしたほうがいい。
https://msdn.microsoft.com/ja-jp/library/ms188059.aspx
datetime型を「YYYY-mm-dd HHss」にしたい
MSSQL側がdatetim型の場合そのままMySQLへ持ってくると
2015-08-03 20:06:00.000のようになる。
以下の用にCONVERTすることで 2015-08-03 20:06:00で取得可能
convert(varchar, start_datetime, 120) AS start_datetime,
文字コード問題
これはMSSQLだから~という固有の問題ではないが、異なるミドルウェア間で文字コードが異なる場合はプログラムなのでConvertが必要。
PHPでは、
mb_convert_encoding ( string $str , string $to_encoding [, mixed $from_encoding = mb_internal_encoding() ] )
のように変換する。
($strを変換元文字コード→変換後文字コード)
http://php.net/manual/ja/function.mb-convert-encoding.php