Open7

SQL Serverの横棒記号の取扱

hrsma2ihrsma2i

調査方法

Docker で SQL Server コンテナを立ち上げ、以下のSQLを実行。

CREATE TABLE [dbo].[yokobo](
  [symbol] [nvarchar](100) NOT NULL,
  [yomi] [nvarchar](100) NOT NULL
)
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'-', N'全角ハイフンマイナス');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'-',  N'半角ハイフンマイナス');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'‐',  N'全角ハイフン');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'−',  N'全角マイナス');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'‒',  N'フィギュアダッシュ');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'—',  N'全角ダッシュ(emダッシュ)');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'–',  N'二分ダッシュ(enダッシュ)');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'―',  N'ホリゾンタルバー');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'ー', N'全角長音');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'ー',  N'半角長音');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'─',  N'罫線(ライト)');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'━',  N'罫線(ヘビー)');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'ㅡ', N'ウ(ハングルの字母)');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'ـ',  N'カシーダ');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'⁻',  N'上付きマイナス');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'₋',  N'下付きマイナス');
INSERT INTO [dbo].[yokobo] (symbol, yomi) VALUES (N'一', N'いち');

文字列の先頭にNをつけないと文字化けする。
参考:SQLServerに日本語データをInsertすると文字化けする。 - lycheejam's tech log

1つずつ調べていく。こちらもNをつけ忘れずに。

SELECT * FROM yokobo WHERE symbol = N'-'
hrsma2ihrsma2i

結果

以下のグループのみが同一視され、他の記号どうしは同一視されなかった。

  • (1)
    • -(全角ハイフンマイナス)
    • -(半角ハイフンマイナス)
  • (2)
    • ー(全角長音)
    • ー(半角長音)
hrsma2ihrsma2i

SQL Serverの横棒記号の取扱 #SQLServer - Qiita との違い

  • 「-(全角マイナス) 」は正しくは「全角ハイフン/マイナス」。「全角マイナス」は「−」。
  • 「―(全角ダッシュ)」は「ホリゾンタルバー」とも言う。「全角ダッシュ(em ダッシュ)」は「—」であり、欧文用。
    • 自分が調べた結果だと、 「―(ホリゾンタルバー)」≠ 「ー(全角長音)」 = 「ー(半角長音)」だった。
  • ただし、ユニーク制約においては、「―(ホリゾンタルバー)」=「ー(全角長音)」 = 「ー(半角長音)」が同一視された(謎)。
hrsma2ihrsma2i

N無しの結果

DDL およびクエリで、文字化け回避のための N 無しで試した結果は以下。

  • 以下は挿入時に「-(半角ハイフンマイナス)」に変換されてしまう。それ以外は文字化け。
    • 「-(全角ハイフンマイナス)」
    • 「-(半角ハイフンマイナス)」
    • 「‐(全角ハイフン)」
    • 「−(全角マイナス)」
    • 「─(罫線(ライト))」
  • また、上記のみが同じ記号として扱われ、どのみち、 SQL Serverの横棒記号の取扱 #SQLServer - Qiita とは異なる結果になった。