トップ回答者
全角長音文字が含まれる文字列の比較

質問
-
単純な文字列の比較で質問があります。
ServerレベルでもDBレベルでものCollationはJapanese_CI_AS となってます。
@@VERSIONは、
"Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
May 14 2014 18:34:29
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
"
実際はテーブルのカラムも比較処理で結果がおかしくて調べてたところ、
下記の現象が発生しました。
Management Studioで下記を実行すると、"="が表示されます。
'9ー9'と'99ー'が同じと解釈されました。
「ー」は全角長音です。
(1)
---------------------------
if '9ー9' = '99ー'
print '='
else
print '<>'
---------------------------
因みに、CollationにJAPANESE_BIN を指定すると結果は"<>"が表示されます。
(2)
---------------------------
if '9ー9' collate JAPANESE_BIN = '99ー' collate JAPANESE_BIN
print '='
else
print '<>'
---------------------------
どんな場合にこの現象が発生するのか、イマイチ特定できないでいます。
「ー」の文字を下記で試したり、「9」をひらがなや漢字でも試してみました。
ー(全角長音)
―(全角ダッシュ)
‐(全角ハイフン)
-(全角マイナス)
~(全角波型)
-(半角ハイフン)
---------------------------
create table #temp
(
keycol int,
col1 nvarchar(100),
col2 nvarchar(100)
)
insert into #temp values (1,'9ー9','99ー')
insert into #temp values (2,'9―9','99―')
insert into #temp values (3,'9‐9','99‐')
insert into #temp values (4,'9-9','99-')
insert into #temp values (5,'9~9','99~')
insert into #temp values (6,'9-9','99-')
insert into #temp values (11,'9ー9','99ー')
insert into #temp values (12,'9―9','99―')
insert into #temp values (13,'9‐9','99‐')
insert into #temp values (14,'9-9','99-')
insert into #temp values (15,'9~9','99~')
insert into #temp values (16,'9-9','99-')
insert into #temp values (21,'あーあ','ああー')
insert into #temp values (22,'あ―あ','ああ―')
insert into #temp values (23,'あ‐あ','ああ‐')
insert into #temp values (24,'あ-あ','ああ-')
insert into #temp values (25,'あ~あ','ああ~')
insert into #temp values (26,'あ-あ','ああ-')
insert into #temp values (31,'花ー花','花花ー')
insert into #temp values (32,'花―花','花花―')
insert into #temp values (33,'花‐花','花花‐')
insert into #temp values (34,'花-花','花花-')
insert into #temp values (35,'花~花','花花~')
insert into #temp values (36,'花-花','花花-')
select
case when col1 collate Latin1_General_CI_AS = col2 collate Latin1_General_CI_AS then 'matched' else 'unmatched!!' end as 'Latin1_General_CI_AS',
case when col1 collate JAPANESE_BIN = col2 collate JAPANESE_BIN then 'matched' else 'unmatched!!' end as 'JAPANESE_BIN',
case when col1 collate Japanese_CS_AS_KS_WS = col2 collate Japanese_CS_AS_KS_WS then 'matched' else 'unmatched!!' end as 'Japanese_CS_AS_KS_WS',
case when col1 = col2 then 'matched' else 'unmatched!!' end as 'Japanese_CI_AS',
*
from #temp
---------------------------
---------------------------
結果
---------------------------
Latin1_General_CI_AS JAPANESE_BIN Japanese_CS_AS_KS_WS Japanese_CI_AS keycol col1 col2
matched unmatched!! unmatched!! matched 1 9ー9 99ー
unmatched!! unmatched!! unmatched!! matched 2 9―9 99―
unmatched!! unmatched!! unmatched!! unmatched!! 3 9‐9 99‐
unmatched!! unmatched!! unmatched!! unmatched!! 4 9-9 99-
unmatched!! unmatched!! unmatched!! unmatched!! 5 9~9 99~
unmatched!! unmatched!! unmatched!! unmatched!! 6 9-9 99-
matched unmatched!! matched matched 11 9ー9 99ー
unmatched!! unmatched!! matched matched 12 9―9 99―
unmatched!! unmatched!! unmatched!! unmatched!! 13 9‐9 99‐
unmatched!! unmatched!! unmatched!! unmatched!! 14 9-9 99-
unmatched!! unmatched!! unmatched!! unmatched!! 15 9~9 99~
unmatched!! unmatched!! unmatched!! unmatched!! 16 9-9 99-
unmatched!! unmatched!! unmatched!! unmatched!! 21 あーあ ああー
unmatched!! unmatched!! unmatched!! unmatched!! 22 あ―あ ああ―
unmatched!! unmatched!! unmatched!! unmatched!! 23 あ‐あ ああ‐
unmatched!! unmatched!! unmatched!! unmatched!! 24 あ-あ ああ-
unmatched!! unmatched!! unmatched!! unmatched!! 25 あ~あ ああ~
unmatched!! unmatched!! unmatched!! unmatched!! 26 あ-あ ああ-
matched unmatched!! matched matched 31 花ー花 花花ー
unmatched!! unmatched!! matched matched 32 花―花 花花―
unmatched!! unmatched!! unmatched!! unmatched!! 33 花‐花 花花‐
unmatched!! unmatched!! unmatched!! unmatched!! 34 花-花 花花-
unmatched!! unmatched!! unmatched!! unmatched!! 35 花~花 花花~
unmatched!! unmatched!! unmatched!! unmatched!! 36 花-花 花花-
---------------------
とりあえず、まずJapanese_CI_AS で'9ー9'と'99ー'が同じと解釈される理由が知りたいです。
回答
-
照合順序 – 文字の比較と並び順によると
「々」「ー」(長音) などは、直前の文字の繰り返しであり、それ自体は意味を持たないものとして解釈されます。
だそうです。なのでaviator__さんの書かれたように9ー9も99ーも999と見なされるのでしょう。
- 回答の候補に設定 星 睦美 2016年4月21日 5:40
- 回答としてマーク M.Hanafusa 2016年4月22日 0:26
すべての返信
-
まず、先に謝っておきますが回答ではなく状況証拠でしかない返信です。
結論としてですが、ー(全角長音)は直前の一文字と同じ文字とみなされるようです。
※しかも、どうやら全角平仮名・全角片仮名等は例外の様です。9ー9と9ー9が同じ判定との事ですが、
「9ー9」はーは直前の文字=9なので999とみなされ、
「99-」もーは直前の文字=9なので999とみなされて結果同じと見られる様です。例えば、
「98ー」⇒「988」とみなされ、
「9ーーーー」⇒「99999」とみなされる様です。ちなみに、
「花ー」⇒「花花」や、
「@ー」⇒「@@」も同じと判定されました。う~ん、逆にナゼ平仮名と片仮名はだめなんだろ???
- 回答の候補に設定 星 睦美 2016年4月21日 5:40
-
照合順序 – 文字の比較と並び順によると
「々」「ー」(長音) などは、直前の文字の繰り返しであり、それ自体は意味を持たないものとして解釈されます。
だそうです。なのでaviator__さんの書かれたように9ー9も99ーも999と見なされるのでしょう。
- 回答の候補に設定 星 睦美 2016年4月21日 5:40
- 回答としてマーク M.Hanafusa 2016年4月22日 0:26