ワダと申します。初めてブログを書きます。
今回は、OracleとSQLServerの違いについてご紹介したいと思います。
Oracleはそこそこ経験があるけれどSQLServerについてはあまり経験がない、という方にこの記事が少しでもお役にたてば幸いです。
※SQLServer2016、SQLServer Management Studioのインストールを行う必要があります。
インストールの詳細手順については、以下のサイトが参考になります。
■ SQLServerでは「Null」と「空文字」の扱いがOracleとは異なる
SQLServerでは「Null」と「空文字」の扱いがOracleとは異なる点に注意が必要です。
※NULLは「空っぽ」、空文字は「長さ0の文字列」を意味するものとします。
ひとことで言うと、SQLServerは「NULLと空文字は別物」、Oracleは「NULLと空文字はどちらもNULL」となります。
NULLと空文字が格納されたテーブルをSQL Server Management Studio(SSMS)で確認してみると、
データの4件目、5件目で、BUSYO列がそれぞれ”(空文字)、NULLとなっています。
SQLServer
Oracle
Oracleでは、空文字、NULLがどちらもNULLとして扱われます。
以下のようにWHERE句にNULLを含めている場合にも、検索結果が異なるので注意が必要です。
1
|
SELECT * FROM TEST0001 WHERE busyo IS NULL;
|
SQLServer
Oracle
■ データベースの文字コードはどうなっている?
SQLServerで現在のデータベースの文字コードを確認したい場合は、どうすればよいのでしょうか。
Oracleの場合は、「NLS_CHARACTERSET」プロパティを確認すればOKですが、
SQLServerの場合はデータを格納する際の文字コード(コードページ)は「照合順序(Collation)」に依存します。
照合順序とは?
「SQL Server では、文字の大小関係を比較する場合の基準を照合順序 (collation) と呼んでいます。
例えば、「朝」と「海」ではどちらが大きいのか、「あ」「ア」「ア」を大きい順に並べた場合どのように並ぶのかといった、文字の大小関係を決めているのが照合順序です。」
照合順序には、サーバーの照合順序とデータベースの照合順序があり、
データベースの照合順序を設定しない場合はサーバーの照合順序が使用されます。
たとえば、Windowsシステムロケールが日本の場合、
サーバーの照合順序は「Japanese_90_CI_AS」となります。
この照合順序を使用する場合、コードページが932(=Shift_JIS)となり、これがデータベースに格納される文字となります。
「Japanese_90_CI_AS」」の意味は次の通り。
- 「C」-Case:大文字小文字(例:”A”と”a”)
- 「I」-Insensitive:識別しない
- 「S」-Sensitive:識別する
- 「A」-Accesnt:アクセント記号
⇒「日本語・大文字小文字は識別しない・アクセントは識別する」という意味。Like検索やソート順に影響があります。
照合順序の種類は多数あります。
意味、詳細な設定方法については以下のサイトを参考にしてみてください。
■ サンプル(JDBCアプリケーション)
サンプルプログラムを通して先ほどのテーブルにアクセスし、内容を確認してみましょう。
※以下はJavaのバージョン「1.7.0_09」が動作する環境での実施例です。
1. ソース「Sample.java」
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.microsoft.sqlserver.jdbc.SQLServerException;
import com.microsoft.sqlserver.jdbc.SQLServerResultSet;
class Sample {
public static void main(String[] args) {
String email;
String busyo;
String name;
try {
// データベースとの接続
Connection con =
DriverManager.getConnection ("jdbc:sqlserver://localhost;databaseName=TEST","USERNAME","PASSWORD");
// 自動コミットをOFFにする
con.setAutoCommit(false);
String sql1 = "select * from TEST0001 WHERE EMAIL IN('email1@jp' ,'email4@jp','email5@jp');";
PreparedStatement stmt = con.prepareStatement(sql1);
// クエリを発行
System.out.println("クエリを発行します。");
ResultSet rs = stmt.executeQuery();
// 結果を取得
while(rs.next()){
email = rs.getString("email");
busyo = rs.getString("busyo");
name= rs.getString("name");
System.out.println("email == " + email);
System.out.println("busyo == " + busyo);
System.out.println("name== " + name);
}
// データベースのクローズ
stmt.close();
con.close();
} catch (Exception e) {
System.out.println("Exception発生");
e.printStackTrace ();
}
}
}
|
2. サンプル用テーブル作成
SQL Server Management Studio(SSMS)上で、テーブルを作成します。
1
2
3
4
5
6
|
CREATE TABLE TEST0001(
EMAIL varchar(60) NOT NULL,
BUSYO varchar(50) NULL,
NAMEvarchar(50) NULL,
CONSTRAINT [PK_EMAIL] PRIMARY KEY CLUSTERED ([EMAIL] ASC)
)
|
「CLUSTERED」は、主キーに設定されるインデックスのデフォルト値です。(インデックスについては今回は説明を割愛します。)
テーブルが作成できたら、サンプル用データを投入します。
1
2
3
4
5
|
INSERT INTO TEST0001(EMAIL,BUSYO,NAME) VALUES('email1@jp','busyo1','名前1');
INSERT INTO TEST0001(EMAIL,BUSYO,NAME) VALUES('email2@jp','busyo2','名前2');
INSERT INTO TEST0001(EMAIL,BUSYO,NAME) VALUES('email3@jp','busyo3','名前3');
INSERT INTO TEST0001(EMAIL,BUSYO,NAME) VALUES('email4@jp','','名前4');
INSERT INTO TEST0001(EMAIL,BUSYO,NAME) VALUES('email5@jp',NULL,'名前5');
|
SSMSを利用してデータを投入する場合、デフォルトではコミットが自動的に行われる設定になっています。
そのため、デフォルト設定になっている場合はINSERTの後「commit」を実行する必要はありません。
3. JDBCドライバ
Microsoftのサイトからダウンロードします。今回は「Microsoft SQL Server 用 JDBC Driver 6.0 」を使ってみましょう。
https://www.microsoft.com/ja-jp/download/details.aspx?id=11774
ダウンロードしたexeファイルを実行します。実行後に作成されるフォルダに格納されている、「sqljdbc41.jar」を使用します。
4. サンプル実行
任意の場所に、サンプルソースとJDBCドライバ「sqljdbc41.jar」を配置します。
例:D:\test に配置する。
1
2
3
|
D:\test
|-Sample.java
|-sqljdbc41.jar
|
ソースをコンパイルします。
1
2
|
D:\> cd test
D:\test> javac -cp ./sqljdbc41.jar; sample.java
|
実行します。
1
|
D:\test> java -cp ./sqljdbc41.jar; sample
|
5. 実行結果
以上となります。
SQLServerについてOracleに慣れていると違和感を感じがちなポイントを押さえておくと、業務であわてずに済む場面があるかもしれません。
私自身まだまだ勉強中の段階ですので、今後も理解を深めていきたいです。