none
SQL Serverで濁点の違う文字が同じと扱われる

    質問

  • お世話になります。

    SQLServerで濁点のある文字「ブ」と「フ゛」が同じ文字として扱われるため、

    主キーとなる項目に挿入できず困っています。

    Windowsのパスを格納するテーブルがあり、パスを主キーにしています。

    ファイル名では「ブ」と「フ゛」は別物として扱われるため、DB上も別レコードとして登録したいのですが、

    一意制約違反となり登録できません。

    照合順序を変えてみたりしたのですが、解決できていません。

    主キーを別の項目にすると良いのですが、既に稼働中のシステムのため、変更が難しい状況です。

    そもそも無理な事をやろうとしている(仕様バグ)のか、何か対処法があるのか、

    ご存知の方いらっしゃいましたらご教示願えないでしょうか。

    [環境]

    SQLServer2014 SP2

    照合順序:Japanese_XJIS_100_CI_AS_KS_WS


    2018年4月9日 12:05

回答

  • > 照合順序を変えてみたりしたのですが、解決できていません。

    照合順序を Japanese_BIN2 にしたらどうなりますか?

    > ファイル名では「ブ」と「フ゛」は別物として扱われるため、DB上も別レコードとして登録したいのですが、一意制約違反となり登録できません。

    照合順序 Japanese_XJIS_100_CI_AS_KS_WS では多分「ブ」と「フ゛」は同じとして扱われていると思います。

    詳しくは以下の記事を見てください。

    日本語照合順序での 濁音、半濁音 の取り扱いについて
    https://blogs.msdn.microsoft.com/jpsql/2014/12/11/2353/

    記事では、日本語照合順序では「『"半角文字" + "濁音、半濁音"』が 1 文字として認識されます」とありますが、全角文字「ブ」と「フ゛」も同じ扱い、多分濁点がない「フ」と同じになると思われます。

    • 回答としてマーク rassy256 2018年4月10日 0:40
    2018年4月9日 14:20

すべての返信

  • > 照合順序を変えてみたりしたのですが、解決できていません。

    照合順序を Japanese_BIN2 にしたらどうなりますか?

    > ファイル名では「ブ」と「フ゛」は別物として扱われるため、DB上も別レコードとして登録したいのですが、一意制約違反となり登録できません。

    照合順序 Japanese_XJIS_100_CI_AS_KS_WS では多分「ブ」と「フ゛」は同じとして扱われていると思います。

    詳しくは以下の記事を見てください。

    日本語照合順序での 濁音、半濁音 の取り扱いについて
    https://blogs.msdn.microsoft.com/jpsql/2014/12/11/2353/

    記事では、日本語照合順序では「『"半角文字" + "濁音、半濁音"』が 1 文字として認識されます」とありますが、全角文字「ブ」と「フ゛」も同じ扱い、多分濁点がない「フ」と同じになると思われます。

    • 回答としてマーク rassy256 2018年4月10日 0:40
    2018年4月9日 14:20
  • SurferOnWww様

    >> 照合順序を変えてみたりしたのですが、解決できていません。

    >照合順序を Japanese_BIN2 にしたらどうなりますか?

    データベースだけでなくインスタンスの照合順序を変更したところ「ブ」と「フ゛」を区別して登録出来ました!

    バイナリにしたことでソート順も変わってしまうと思うので、確認して適用させます。

    ご教示ありがとうございました。

    2018年4月10日 0:40
  • 照合順序を変えてみたりしたのですが、解決できていません。

    以下に書かれているように、インデックスがある列などは照合順序を変更することができません。よって、データベースの照合順序を変更しても、主キーの列は照合順序が変わっていないのでしょう。

    列の照合順序の設定と変更
    https://technet.microsoft.com/ja-jp/library/ms190920(v=sql.105).aspx

    おそらく主キーがある列の照合順序だけ変えれば良いと思われますので、上記の記事に従って、主キーの列の照合順序を再度変更してみて下さい。その際、一度主キーの設定を外すなど、どこからも参照されていない状態にしなければ変更することができません。
    照合順序の変更が終わりましたら、再度、主キー等の設定を行って下さい。
    上記の手順でうまく行くはずですが、作業前に念のためにデータベースのバックアップを取って下さい。


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年4月10日 0:54
  • データベースだけでなくインスタンスの照合順序を変更したところ「ブ」と「フ゛」を区別して登録出来ました!

    結局、データベースを再構築したということですよね。
    う~ん、そこまでする必要はなかったと思いますが、それで問題ないのであればそれでも良いと思います。
    ただ、私が上に書いたことは今後のために頭の隅にでも入れておかれると良いと思います。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    • 編集済み trapemiya 2018年4月10日 1:03 誤字訂正
    2018年4月10日 1:01
  • > インデックスがある列などは照合順序を変更することができません。よって、データベースの照合順序を変更しても、主キーの列は照合順序が変わっていないのでしょう。

    質問者さんの DB のスキーマ等は不明ですので想像ですが、そういう話ではなくて、DB の照合順序を変更するとその配下のテーブルの照合順序も変更されるものの、テーブル内の列の照合順序は元のまま変わらないという話ではないかと思います。

    (1) DB の照合順序を変更

    (2) 配下のテーブルの照合順序も変更される

    (3) テーブル内の列の照合順序は元のまま変わらない

    (4) 列の照合順序の変更

    2018年4月10日 2:26
  • 質問者さんの DB のスキーマ等は不明ですので想像ですが、そういう話ではなくて、DB の照合順序を変更するとその配下のテーブルの照合順序も変更されるものの、テーブル内の列の照合順序は元のまま変わらないという話ではないかと思います。

    なるほど。主キーだから変わらないのではなく、列は全て変わらないということだったのですね。いずれにしても、問題の本質は、「列の照合順序」を変えなければならなかったということですね。
    情報、ありがとうございました。

    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年4月10日 2:48