none
データを更新すると文字化けしてしまう RRS feed

  • 質問

  • いつも大変お世話になっております。
    SQL Server 2008 R2を利用しています。

    Management StudioからUpdate文を実行しているのですが、
    特定の文字列が文字化けしてしまいます。

    実行しているSQLは次の通りです。
    -------------------------
    update sampleTable
    set sampleColumn2 = '5−ア'
    where sampleColumn1 = '12345678'
    -------------------------

    実行結果を取得すると、次のようになってしまいます。
    -------------------------
    5?ア
    -------------------------

    「−」が「?」に置き換わってしまうのです。

    私なりに調べてみたのですが、
    どう調べてよいかも分からず、困ってしまいました。

    試せたこととしては、文字化けをキーワードに調べていたら、
    Unicode文字列を格納するためにはNプレフィックスを付ける
    という情報を見付けたので、試してみましたが効果はなかったです。

    もし解決策をご存知でしたら、教えて頂けないでしょうか。
    ぜひお願い致します。
    2013年7月4日 5:19

回答

  • # ところで 0×2212 でなく 0x2212 です。どういうキー入力の仕方をしているのでしょうか…。より正確には U+2212 ですがそこまで求めないにしても16進数の書き方ぐらい把握しておくべきです。

    MINUS SIGNでググるとUnicode - 波ダッシュ・全角チルダ問題なんてページも見つかります。本当にMINUS SIGNを格納したいのでしょうか? 文字コード変換で意図しない文字に変換されているだけではありませんか?
    # 複数のシステムでUnicode - SHIFT_JISの変換テーブルが異なるから意図しない結果になっているだけだと思うのですが。そのまま無理やり格納しても他の部分で別のほころびが出てくるだけだから、変換テーブルの違いについて真剣に向き合うべきとは思いますが。

    単純に保存したいのならnvarcharを使いましょう。

    • 回答としてマーク コンドル 2013年7月4日 7:26
    2013年7月4日 7:15

すべての返信

  • Unicode文字列を格納するためにはNプレフィックスを付ける
    という情報を見付けたので、試してみましたが効果はなかったです。

    この認識が間違っています。NプレフィックスはSQL文中の文字列をUnicodeにするだけの機能しかありません。そしてSQLでは格納先のデータ形式に合わせて変換されます。

    つまり、重要なのはテーブルのカラム定義ですが、どうなっているのでしょうか? char / varchar / text型であればUnicodeからSHIFT_JISなどに文字コード変換されます。nchar / nvarchar / ntext型であれば、Unicodeのまま格納されます。

    また目指すべきゴールを正しく認識しているのでしょうか? Unicodeには横棒のように見える文字が10種類以上も存在します。この中にはSHIFT_JISなどで格納可能な文字と、そうでない文字があります。使用している文字が間違っている可能性はありませんか?

    2013年7月4日 5:40
  • ご回答ありがとうございます。

    カラムの定義はVARCHARになっております。
    ということはUnicodeにしても意味がないということですね。

    ご紹介頂いたページを参考にすると、
    MINUS SIGN(0×2212)の値を利用したいと考えているようです。

    「?」になっているというのは、
    SHIFT-JISでは扱えない文字列を格納しようとしているため
    と思えば良いでしょうか?

    SHIFT-JISでは扱えないということになると
    解決するためにはnvarcharにする必要があるということ
    でしょうか?

    ご回答頂けますと幸いでございます。
    よろしくお願い致します。


    2013年7月4日 6:03
  • # ところで 0×2212 でなく 0x2212 です。どういうキー入力の仕方をしているのでしょうか…。より正確には U+2212 ですがそこまで求めないにしても16進数の書き方ぐらい把握しておくべきです。

    MINUS SIGNでググるとUnicode - 波ダッシュ・全角チルダ問題なんてページも見つかります。本当にMINUS SIGNを格納したいのでしょうか? 文字コード変換で意図しない文字に変換されているだけではありませんか?
    # 複数のシステムでUnicode - SHIFT_JISの変換テーブルが異なるから意図しない結果になっているだけだと思うのですが。そのまま無理やり格納しても他の部分で別のほころびが出てくるだけだから、変換テーブルの違いについて真剣に向き合うべきとは思いますが。

    単純に保存したいのならnvarcharを使いましょう。

    • 回答としてマーク コンドル 2013年7月4日 7:26
    2013年7月4日 7:15
  • > # ところで 0×2212 でなく 0x2212 です。どういうキー入力の仕方をしているのでしょうか…。より正確には U+2212 ですがそこまで求めないにしても16進数の書き方ぐらい把握しておくべきです。
    リンク先のページをコピーした結果でした。
    私も気付いておりましたが、Webページに記載する際に何か問題があるのだろうか
    と思い、そのままにしてしまいました。
    いずれにしても私の不注意でございます。

    > MINUS SIGNでググるとUnicode - 波ダッシュ・全角チルダ問題なんてページも見つかります。本当にMINUS SIGNを格納したいのでしょうか? 文字コード変換で意図しない文字に変換されているだけではありませんか?
    確かにその通りです。
    ことなるシステムを利用しているために文字コードが変換されております。
    具体的にはDB2のデータをSQL Serverに格納しようとして発生しております。

    > # 複数のシステムでUnicode - SHIFT_JISの変換テーブルが異なるから意図しない結果になっているだけだと思うのですが。そのまま無理やり格納しても他の部分で別のほころびが出てくるだけだから、変換テーブルの違いについて真剣に向き合うべきとは思いますが。
    ありがとうございます。
    全くその通りだと思いましたので、向き合って検討いたします。

    > 単純に保存したいのならnvarcharを使いましょう。
    こちらも参考になりました。

    ありがとうございました。
    2013年7月4日 7:26