none
日本語を入力すると「????」になる RRS feed

  • 質問

  • お世話になります。


    SQLServer2008 R2 で以下のテーブルに日本語を入れると
    「更新失敗 - 別のユーザーが変更」⇒「???? - ?????????」
    「最初の値」⇒「?????」に変換されます。
    半角入力の場合は、問題なく入力されます。


    USE [Northwind]
    GO

    /****** Object:  Table [dbo].[HandleFailedUpdates]    Script Date: 04/04/2011 12:05:16 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    SET ANSI_PADDING ON
    GO

    CREATE TABLE [dbo].[HandleFailedUpdates](
     [ID] [int] NOT NULL,
     [Description] [varchar](64) NOT NULL,
     [OtherColumn] [varchar](64) NOT NULL,
    PRIMARY KEY CLUSTERED
    (
     [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    SET ANSI_PADDING OFF
    GO


    このテーブルは、プログラムから作成したテーブルですが、
    同じデータベース内でManagementStudioから新しいテーブルで作成した場合は、問題なく日本語が入力されます。

    プログラムは、VisualStudio2010 で、VB.Netです。
                cmd.CommandText = "CREATE TABLE HandleFailedUpdates (ID int PRIMARY KEY, Description varchar(64) NOT NULL, OtherColumn varchar(64) NOT NULL)"
                cmd.ExecuteNonQuery()

    どのように設定等を変更すれば、日本語が入力されるようになるのでしょうか?
    よろしくお願いします。

    2011年4月4日 3:16

回答

  • SQL Server では varchar / char 列の文字コードは照合順序という設定によって決まります。
    単純なひらがなで文字が [?] で登録されてしまう場合照合順序が Japanese_xxxxx 以外で設定されている可能性があります。# nvarchar / nchar は UNICODE 文字列となります。

    各列で使用されている照合順序は以下のようなクエリで取得できますので、varchar で全角ひらがな [?] とならない環境と比較してみてはいかがでしょうか?
    データベース名 / テーブル名をお使いの環境に合わせていただければ情報が取得できるはずです。

    USE [TEST]
    GO
    SELECT
     name,
     collation_name
    FROM
     sys.columns
    WHERE
     object_id = OBJECT_ID(N'dbo.Table_1')
    

    以上、ご参考になれば幸いです。

    2011年4月5日 3:34
    モデレータ

すべての返信

  • "varchar"を"nvarchar"にしてみてください。

    使い分けなどは、過去ログにいろいろとありました。varchar nvarcharで検索してみてください。

    「データ型 nvarchar varchar char の使い分けについて」
    http://social.msdn.microsoft.com/Forums/ja-JP/sqlserverja/thread/9c694b83-91a8-4395-ab09-b172078c5798

    「varcharはnvarcharにすべきか?」
    http://social.msdn.microsoft.com/Forums/ja-JP/sqlserverja/thread/e6f63434-a566-4637-8289-1624644aa5ad

    2011年4月4日 4:27
  • 日本語はnvarcharで保存されることをお勧めします。
    さて、プログラムでうまく保存されないのは、UTF-8の特殊な文字(例えば㊞)を保存されようとしていませんか? データベースのテーブルのカラムをnvarcharで作成した上で、insert文でNプレフィックスを使うようにしてみて下さい。
    (例)
    insert into テーブル1 (カラム1, ・・・) values (N'値1', ・・・)

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    2011年4月4日 4:38
  • 早速の返信ありがとうございます。

    "varchar"を"nvarchar"に変更したところ????にならなくなりました。

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

    >UTF-8の特殊な文字(例えば㊞)を保存されようとしていませんか?

    特殊文字は、使用していません。全角ひらがなのみでも????になってしまいます。

    "varchar"でも全角ひらがなのみですと正常にコミットできると思っていますが、なぜか???になってしまいます。

    他のパソコンにあるSQLServer2008 R2で確認しましたが、 "varchar"で全角ひらがなで正常にコミットされました。

    やぱり、どこかの設定が違うような気がして調べてみましたが、特にわかりませんでした。

    OSがWindows7 64ビット(???になる) or XP 32ビット(正常) で違うことはないでしょうか?

    2011年4月5日 1:34
  • SQL Server では varchar / char 列の文字コードは照合順序という設定によって決まります。
    単純なひらがなで文字が [?] で登録されてしまう場合照合順序が Japanese_xxxxx 以外で設定されている可能性があります。# nvarchar / nchar は UNICODE 文字列となります。

    各列で使用されている照合順序は以下のようなクエリで取得できますので、varchar で全角ひらがな [?] とならない環境と比較してみてはいかがでしょうか?
    データベース名 / テーブル名をお使いの環境に合わせていただければ情報が取得できるはずです。

    USE [TEST]
    GO
    SELECT
     name,
     collation_name
    FROM
     sys.columns
    WHERE
     object_id = OBJECT_ID(N'dbo.Table_1')
    

    以上、ご参考になれば幸いです。

    2011年4月5日 3:34
    モデレータ
  • Masayuki.Ozawa様。返信ありがとうございます。
    早速、ためしてみました。

    正常に表示されるのは、「Japanese_CI_AS」
    「???」になるのは、「SQL_Latin1_General_CP1_CI_AS」
    でした。

    確認しましたところ、
    サーバーのプロパティをみると、サーバー照合順序は、
    「Japanese_CI_AS」になっています。

    Northwindデータベースの照合順序が「SQL_Latin1_General_CP1_CI_AS」
    になっていることが原因だとわかりました。Northwindデータベースは、
    学習のためダウンロードしたデータベースでした。現在、学習している本が、
    マイクロソフト公式本ですが、日本語訳で出版されているためその点が考慮
    されていなかったため、そのままサンプルコードを実行しても結果が「???」
    になってしまったと思われます。

    無事に解決できました。ありがとうございました。



    2011年4月5日 4:07