ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

SQL Serverの照合順序は、テーブル名にも影響する

最近は、SQL Serverの照合順序周りを勉強しているのですが、この照合順序はテーブル名にも影響することを知りました。

例えば、以下の通りデータベースとテーブルを作成します。

CREATE DATABASE Sample COLLATE Japanese_CS_AS;
go

USE Sample
go
CREATE TABLE [dbo].[Products] (
	[id] [tinyint] NULL,
	[name] [nvarchar](50) NULL
);


注目すべきは、データベース作成時にCOLLATE句に「Japanese_CS_AS」を指定しているということです。「CS」オプションは、"大文字と小文字を区別する"という指定を行うためのオプションですね。
照合順序と Unicode のサポート - SQL Server | Microsoft Learn

それでは、上記で作成したProductsテーブルを以下の通り検索してみましょう。
もちろんデータを登録していないので、1レコードも表示されませんが参照することはできています。

dbo.Productsテーブルを参照する

今度は、Productsテーブルを大文字「PRODUCTS」にして検索してみましょう。なんということでしょう。エラーが発生してしまいました。

dbo.Productsテーブルを参照する(大文字)

また、上記はテーブル名ですが列名も同様です。今度はidを定義通りに指定して検索しましょう。エラーにはなりませんね。

idを指定して、dbo.Productsテーブルを参照する

idを大文字(ID)にして検索してみましょう。以下の通り、エラーが発生してしまいます。

idを指定して、dbo.Productsテーブルを参照する(大文字)

このように、照合順序の設定がテーブル名や列名までにも影響するのが、SQL Serverの動作のようですね。

照合順序の設定によって、データの大文字、小文字が区別されたり、されなかったりすることは知っていました。しかし、その設定がまさかテーブル名や列名までにも影響があるとは知りませんでした。

Oracleでは、テーブル名や列名などは区別しないと思うので、OracleユーザーがSQL Serverを触った際はこの部分も混乱するポイントかもしれませんね。

今回はこのへんで。最後までお読みいただきありがとうございました。