Date: Thu, 18 Aug 2005 16:14:25 +0900
From: "Akira Horikawa" <who@example.ne.jp>
堀川です、こんにちは
-----Original Message-----
From: kei [mailto:who@example.ne.jp]
Sent: Wednesday, August 17, 2005 10:34 AM
To: who@example.ne.jp
Subject: [ml-msde-beg:01623] テーブルデザインビューの列名に [ ] が自動的に付
く。
>またよくよく見てみると、”リース”と言う言葉に付くようです。
>[○○リース料] または
>[リース料] または
>[リース]
列の名前などの識別子の正式な表現方法は、
ダブルクォートで囲ったり、大カッコで囲ったりします
"識別子名"
[識別子名]
ダブルクォート形式は、
SET QUOTED_IDENTIFIER
sp_dboption の quoted identifier
sp_configure の user options
等で、その使用を制限できますが、大カッコ形式の識別子は
常に使用することができます。
SQLServerでは、識別子に使える文字が拡張されており、例えば
空白やマイナスなどの記号も使えます。
しかしこのような文字を使用するときは、ダブルクォートや大カッコ
で囲まないと、別の意味に解釈され、SQL文のエラーになったりします。
SELECT [A-B] FROM [T A B L E]
日本語版SQLServerでは、識別子に使える記号文字の全角と半角は
区別しません。
厳密には、作成されたデータベースの「既定の照合順序」に従います。
SELECT DATABASEPROPERTYEX('データベース名','Collation')
as '現在のデータベースの既定の照合順序'
を実行したときに、Japanese_CI_AS と表示される場合です。
「ひらがなとカタカナ」が区別されず、「半角と全角」が区別されません。
Japanese_CI_AS と表示されるデータベース(通常のデータベース)で
次のSQL文を実行してください。
SELECT DATABASEPROPERTYEX('JapaneseTest','Collation')
as '現在のデータベースの既定の照合順序'
declare @a varchar(1)
declare @AA varchar(2)
select @a = 'ア' --半角
select @AA = 'ア' --全角
IF( @a = @AA ) PRINT 'ア = ア 一致しました'
select @a = '-' --半角マイナス
select @AA = '−' --全角マイナス
IF( @a = @AA ) PRINT '- = − 一致しました'
select @a = '-' --半角マイナス
select @AA = 'ー' --全角日本語長音横棒(全角マイナスとは違う)
IF( @a <> @AA ) PRINT '- = 日本語長音横棒 一致しません'
それぞれのPRINT文が出力されます。
ここで注意するのは、半角マイナスと全角マイナスは同じ文字として扱われます
日本語の横棒(ー)は、マイナス記号と区別されます。
SELECT A-B FROM TABLE
というSQL文があったときに、A-Bが、マイナス記号が含まれている特別な
列の名前で、[A-B]と表現しなければいけないのか、それとも、列名Aと列名B
のマイナス演算の結果なのか、区別できません。
そこで、このような曖昧な状態では、SQL文の文法エラーとします。
全角マイナス記号も、通常のデータベースでは、半角マイナスと同じ扱いを
受けるので、大カッコで囲む必要があります。[A−B]のように。
半角や全角が区別されないので、次のような命令はエラーになります。
CREATE TABLE TEST (
[A-B] VARCHAR(10) , --すべての文字が半角
[A−B] VARCHAR(10) --すべての文字が全角
)
同じ列名が重複に存在するというエラーが出ます。
一方、
CREATE TABLE TEST (
[リ−ス] VARCHAR(10) , --日本語全角マイナス
[リース] VARCHAR(10) --日本語横棒
)
は、日本語全角マイナスと日本語全角横棒は区別されるので、正しく
テーブルが作成されます。
この場合、
--最初が全角マイナス
--次が日本語横棒
select リ−ス , リース from TEST
は、SQL文のエラーになります。
日本語全角マイナスは半角マイナスと同じ扱いを受けるので、
[]で囲みます。
select [リ−ス] , リース from TEST
本来、リース(日本語横棒)には、SQL文法上は、カッコを囲む必要は
ありません。
ただ、Enterprise ManagerやAccess等では、カッコを付けて表示してくれます。
もし、データベース上で、半角文字と全角文字を区別するという設定にしたら
結果は異なります。
create database Japanese_TEST_WS
GO
SELECT DATABASEPROPERTYEX('Japanese_TEST_WS','Collation')
as '現在のデータベースの既定の照合順序'
GO
--照合順序を変更する
ALTER DATABASE Japanese_TEST_WS
COLLATE Japanese_CI_AS_KS_WS
GO
SELECT DATABASEPROPERTYEX('Japanese_TEST_WS','Collation')
as '現在のデータベースの既定の照合順序'
GO
上記のようにデータベースを作成して、
declare @a varchar(1)
declare @AA varchar(2)
select @a = 'ア' --半角
select @AA = 'ア' --全角
IF( @a = @AA ) PRINT 'ア = ア 一致しました'
select @a = '-' --半角マイナス
select @AA = '−' --全角マイナス
IF( @a = @AA ) PRINT '- = − 一致しました'
select @a = '-' --半角マイナス
select @AA = 'ー' --全角日本語長音横棒(全角マイナスとは違う)
IF( @a <> @AA ) PRINT '- = 日本語長音横棒 一致しません'
を実行して見てください。
半角と全角を区別しますので、半角カナと全角カナは異なります。
また、
CREATE TABLE TEST (
[A-B] VARCHAR(10) , --すべての文字が半角
[A−B] VARCHAR(10) --すべての文字が全角
)
のテーブル作成も成功します。
以上からもわかるように、SQL Server 2000(MSDE 2000)は、
国際語対応になっており、識別子名や、列に代入する文字の
値等は、
データベースの既定の照合順序
や
テーブルの列単位に設定された照合順序
などに従います。
識別子に日本語を使うかどうかの問題は、永遠の課題のように思えます。
すべての製品をマイクロソフト社のもので固める環境であれば、分かり
易いので、日本語識別子が悪いとは言えないでしょう。
ただ、Linux等のWebから、WindowsのSQL Serverへ接続するような
場合は、識別子が日本語になっていると都合が悪い場合が多々
発生します。
またSQL ServerからフリーのRDBへ移植するとか、フリーRDBと
連携作業をさせるような場合も、識別子の問題が発生します。
使い勝手に重点を置くのか、移植性に重点を置くのか、その基準に
よって、日本語の良し悪しを判断されると良いでしょう
------------------------------------
Epata-IT/(株)日本技術ソフト開発
堀川 明 (Akira Horikawa)
08月18日(木曜日) 16時11分記
mailto:who@example.ne.jp
http://www.horikawa.ne.jp/msde/
[MSDE/SQLServerに関して、今、どんなことにお困りですか?] |
よろしければお困りの内容を、電子メールで教えて下さい。 |
質問を電子メールで作成する
|
[ウィンドを閉じる][MSDE/SQLServer FAQ ][MSDE / MSDE2000 技術サポート情報一覧]
|