LoginSignup
4
4

More than 5 years have passed since last update.

主にMySQL使っているエンジニアがMSSQLで戸惑ったこと

Last updated at Posted at 2015-08-04

概要

主に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 HH:flag_mm:ss」にしたい

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4