- 開発技術
MySQLとSQL Serverの仕様の違いと注意点
- SQL Server
- MySQL

はじめに
【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc. 詳細はこちらから>
MySQLを主に使用している開発者がSQL Serverのプロジェクトに携わる際、両者の仕様の違いを意識しないまま実装を進めると、想定外の不具合を引き起こすことがあります。本稿では、注意すべき仕様の違いを3点取り上げます。
CHAR、VARCHARにおける文字カウントの違い
MySQLのCHAR(n)、VARCHAR(n)は、nが「文字数」を表します。日本語であっても1文字を1としてカウントするため、VARCHAR(10)には日本語10文字を格納できます。
一方、SQL ServerのCHAR(n)、VARCHAR(n)は、nが「バイト数」を表します。日本語(Shift-JISなど)は1文字あたり2バイトで扱われるため、VARCHAR(10)には日本語5文字しか格納できません。なお、CHAR、VARCHARとは別に、nが文字数を表すNCHAR(n)、NVARCHAR(n)も存在します。
CHARにおける末尾空白の扱いの違い
固定長文字列型のCHARは、格納時に指定した桁数に満たない場合、末尾を空白で埋める仕様となっています。ここでMySQLとSQL Serverの間で、データ取得時の挙動に違いがあります。
MySQLでは、CHAR型のカラムからデータを取得した際に、末尾の空白が自動的に取り除かれます。一方、SQL Serverでは取得後もカラムの定義桁数分の空白が保持されたままとなります。そのため、SQL Serverで取得したCHAR型の文字列は末尾に空白が残っている点を意識し、異なるデータソースや型と比較・結合を行う場合はRTRIM関数などでトリム処理を行うとよいでしょう。
なお、MySQLもSQLモードの設定として「PAD_CHAR_TO_FULL_LENGTH」を有効にすることで末尾空白を保持させることができます。しかし、この設定はMySQL 8.0において非推奨となっており、将来的に廃止される可能性があります。
バインドパラメータ数の上限と対策
SQL Serverには、1つのクエリで使用できるバインドパラメータの総数が2100個までという制限があります。MySQLにはこのような制限はありません。
この制限が問題になりやすいのは、IN句に大量のパラメータを渡すケースです。例えばIDのリストが2100件を超えるような場合、SQL Serverではエラーとなります。
対策の1つとして、パラメータをまず一時テーブルにINSERTし、対象テーブルとJOINする方法があります。
【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>



