none
全角長音文字が含まれる文字列の比較 RRS feed

  • 質問


  • 単純な文字列の比較で質問があります。

    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ー'が同じと解釈される理由が知りたいです。
    2016年4月20日 9:15

回答

すべての返信

  • まず、先に謝っておきますが回答ではなく状況証拠でしかない返信です。

    結論としてですが、ー(全角長音)は直前の一文字と同じ文字とみなされるようです。
    ※しかも、どうやら全角平仮名・全角片仮名等は例外の様です。

    9ー9と9ー9が同じ判定との事ですが、
    「9ー9」はーは直前の文字=9なので999とみなされ、
    「99-」もーは直前の文字=9なので999とみなされて結果同じと見られる様です。

    例えば、
    「98ー」⇒「988」とみなされ、
    「9ーーーー」⇒「99999」とみなされる様です。

    ちなみに、
    「花ー」⇒「花花」や、
    「@ー」⇒「@@」も同じと判定されました。

    う~ん、逆にナゼ平仮名と片仮名はだめなんだろ???

    • 回答の候補に設定 星 睦美 2016年4月21日 5:40
    2016年4月20日 11:10
  • 照合順序 – 文字の比較と並び順によると

    「々」「ー」(長音) などは、直前の文字の繰り返しであり、それ自体は意味を持たないものとして解釈されます。

    だそうです。なのでaviator__さんの書かれたように9ー9も99ーも999と見なされるのでしょう。

    • 回答の候補に設定 星 睦美 2016年4月21日 5:40
    • 回答としてマーク M.Hanafusa 2016年4月22日 0:26
    2016年4月20日 14:24
  • なるほど、おかげで現象の内容は理解できました。

    平仮名と片仮名が例外なのは、未だ謎ですが。

    住所を比較する処理があり結果がおかしくて調べてました。

    例えば、'山田町11ー1' = '山田町1ー11'は同じ住所して判断してしまったようで。

    CollationにJAPANESE_BINを指定して対処することしました。

    ありがとうございます。

    2016年4月21日 0:32
  • 「々」「ー」の特別な仕様があるのは知りませんでした。

    この現象を見つけたのが外国人(日本語は堪能ですが)で、理由を探るのに苦労してました。

    情報をいただきありがとうございます。

    2016年4月21日 0:35