SQL Serverのキャラクターセットとは?定義場所や文字化け対策について知りたい

このQ&Aのポイント
  • SQL Serverのキャラクターセット(内部文字コード)はどこで定義するのか、そして文字化け対策はどのように行えば良いのかについて教えてください。
  • Oracleで使用していた経験から、DB内部のキャラクターセットとクライアントの文字セット(NLS_LANG)を意識する必要があることを学びました。SQL Serverでも同様の問題が発生する可能性があるため、キャラクターセットの定義場所と文字化け対策について教えてください。
  • システム構築時には文字化けを避けるために注意が必要です。SQL Serverのキャラクターセットの定義場所と文字化け対策について知りたいので、教えていただけますか?
回答を見る
  • ベストアンサー

SQL Server のキャラクターセット(内部文字コード)は何処で定義するのでしょうか?

SQL Server超初心者です。(Oracleについては約1年ちょっとの経験はあります)どうぞよろしくお願いします。 今回SQL Server2005 を使って簡単なシステムを構築する事になりました。 SQL Serverが扱う文字コートについて教えてください。 Oracleを使っていた時の経験としてDB内部のキャラクターセットと クライアントで使う文字セット(NLS_LANG)を意識しておかないと、いろんな「文字化け」問題に遭遇した時に対応できませんでした。 きっとSQL Serverにおいても同じような事ではないかと思いここに質問させていただきます。 以下2点についてどなたかコメント願います。 1.(Oracleでいうキャラクターセット)はどこで定義するのでしょうか? 2.OracleでいうNLS_LANGに相当するものはあるのでしょうか?  (ひょっとしたらマイクロソフト製品なのでサーバもクライアントもCP932固定なのでしょうか?) 根本的にはシステム構築する上で『極力文字化けに遭遇したくない』思い出このような質問をさせていただきました。 『文字化け』について注意点などありましたら合わせてコメントいただければ助かります。 以上よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tantana
  • ベストアンサー率100% (1/1)
回答No.2

Windowsのロケールの設定を日本語にした状態でSQLServerをインストールした場合、cp932がデフォルトの照合順序になります。照合順序については参考URLをご覧下さい。 SQLServerではわかりませんが、PostgresではJDBCドライバ部分で変換していたように記憶しています。ODBCドライバではAutoTranslateという機能があります。 このため、ODBC接続で何も考えずにvarcharを使用するとcp932になります。

参考URL:
http://www.microsoft.com/japan/msdn/sqlserver/sql2005/bb330962.aspx

その他の回答 (1)

  • tantana
  • ベストアンサー率100% (1/1)
回答No.1

1.2.の質問からはずれている回答かもしれませんが・・・ SQLServerでは使用するデータ型によって文字コードが指定されます。 ・データ型がchar、varchar、textの場合 MS932(≒Shift_JIS) 日本語環境の場合 ・データ型がnchar、nvarchar、ntextの場合 Unicode 同一システム内でMS932を使用するか、Unicodeを使用するかどちらかに統一することができれば、システム内で文字化けが発生することはありません。 ただ、char系は使用するバイト数、nchar系は使用する文字数で確保するサイズを指定するので注意が必要です。 例えば、varchar(80)は80バイト確保されますので半角文字で80文字分、全角文字で40文字分保存できますが、nvarchar(80)は80文字分確保されるので全角半角関係なく80文字きっかり保存できます。

orazakkun
質問者

お礼

tantanaさん回答ありがとうございます。 データ型によって内部でのキャラクターセットが異なる点理解しました。 ついでに以下の点についても教えてください。 「日本語環境の場合」と条件を記載されておりますが、 具体的には「何を持って」日本語環境となるのでしょうか? またDB内部のキャラクタセットと、クライアント側のキャラクタセットが 異なる場合(例:VARCHARのデータをJDBCにてアクセスするような場合) MS932→Unicode(UTF02?)への変換は何処で行われるのでしょうか? ご存知であれば教えてください。 困り度を「暇なときにでも」としたせいか、 私の質問が的を外しているのか、どなたからも コメントがなく不安でおりました。 tantanaさんのコメントに内心かなりホッ!としています。 ありがとうございました。

関連するQ&A

  • クライアントとサーバーのキャラクタセットの設定について

    クライアントとサーバーのキャラクタセットの設定について OS WindowsXP VisualStudio .NET 2003 + Oracle にてASP.NET 1.1 の 開発を行っております。 現在、開発PC とOracleDBインスタンスのあるサーバーPCで 開発PCから、OracleDBインスタンスに接続して、DBの値を取得 しているのですが、 日本語が、「???」で、表示されて しまうのです。中には、正しく、表示されている文字もございます。 内部処理のエンコードの問題だとは思うのですが、コンパイル後 作成したWEBアプリをDBと同じサーバーにアップしまして、アプリ ケーションを動かしますと、文字化けが起こらないのです。 DBサーバーと開発PCは 同ドメイン内で、別IPのPC同士の環境です。 ちなみにASPX側は、全て、以下のようにSHIFT-JISのエンコードを指定しておりまして、 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head> <title>ShainEdit</title> <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name=vs_defaultClientScript content="JavaScript"> <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5"> <meta http-equiv="content-type" content="text/html; charset=Shift_JIS"> <meta http-equiv="content-Script-Type" content="text/javascript"> </head> Web.configの XMLの宣言は <?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> という"utf-8"の宣言をしております。 グローバリゼーションに <globalization uiCulture = "ja" culture="ja-JP" requestEncoding="Shift-JIS" responseEncoding="Shift-JIS" fileEncoding="Shift-JIS" /> を指定しております。 XMLの宣言をShift-JISにしますと、HTMLで文字化けしますし、 グローバリゼーションで、utf-8を指定すると文字化けします。 Oracle側は NLS_CHARCTERSET JA16SJIS NLS_NCHAR_CHARACTERSET AL16UTF16 です。 クライアント側の環境変数は NLS_CHARCTERSET JA16SJIS です。 下の書き込みを拝見しまして、 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> http://questionbox.jp.msn.com/qa1286206.html 通常の場合、文字化けは、クライアント側のNLS_LANGの設定と クライアントアプリケーションがセットする文字列値の文字コードの 不一致が原因です。 例えば、WEBサーバが日本語Windows上で稼働している場合、 NLS_LANGは、デフォルトで、JA16SJISになっていると思いますが、 JA16SJISで、値を設定するべきところ、ASPがutf-8などで 値を設定している等の話だと思います。 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> まさに、自分が、この状況だと思います。 ただ、デバック時は、うまくいかなくて、アプリ化して、同サーバー上で、アプリを動かすと、 文字化けしないのが、どうもしっくりきません。 どなたか教えていただけますと幸いです。 投稿日時 - 2010-03-30 11:42:04

  • oracleの文字コードとlinuxサーバの文字コードが異なる場合、サ

    oracleの文字コードとlinuxサーバの文字コードが異なる場合、サーバからシェルまたはsqlplusでDBに接続し、spoolコマンドで指定したファイルに、SQLの実行結果や、PLSQLのDNMS_OUTPUTで出力した内容を保存すると文字化けしてしまいます。 これを回避するにはどうすればよいのか、ご教授下さい。 具体的な環境は、下記の通りです。 oracles:SJIS(NLS-LANGはSJIS系にしています) サーバUTF8 出来ればUTF8でファイルに出力したいのですが、無理なら最低でもSJISで出力させたいです。現在は、ftpでバイナリーダウンロードさせて秀丸などのエディターで見ても、どちらとも認識できない文字コードになっているようです。 なお、お客様側のサーバなので、DBやOSの文字コードを変えることはできません。

  • oracle9iでユーロ記号を使いたい

    oracle9iを使用したWindowsアプリケーションで、ユーロ通貨記号を使いたいです。 DBのNキャラクタセットは、AL16UTF16。NVarchar2(20)列を用意しています。 クライアントは、環境変数NLS_LANG=JAPANESE_JAPAN.JA16SJIS クライアントでOsqleditを使用したときに、 (文字化けしない)データベースにデータ格納の仕方、 (文字化けしない)データベースからデータの取り出し方を教えて下さい。

  • SQLサーバーの文字化け

    Windows Serverでの文字化けについて教えてください。 会社である日本製の経理パッケージソフトを購入しました。英語OSはサポートしていないという事でしたが、弊社は外資系で日本語OSはインストールできないという事で、テストサーバーを立ててインストールしました。 環境としては・・・ ・Windows Server 2016英語版 ・日本語言語パック ・SQL Server 2016英語語版(照合順序 Japanese_CI_AS) アプリケーションはVisual Basic C++で書かれているそうです。Webアプリケーションではありません。 テストサーバーでは言語パックをインストールしてコントロールパネルの言語と地域を日本語に設定しました。 最初文字化けしたのですが、インターネットで記事を見つけたので以下の操作を行ったら文字化けが解消しました。 コントロールパネルの形式とシステムロケールを一旦英語にする→再起動→日本語にする→再起動 そこで、同じ環境で本稼動サーバーを構築しました。テストサーバーも本稼動サーバーも新しくVM環境でOSからインストールし、SQL Serverをインストールしました。これらのサーバーはこのアプリケーション専用で、他のアプリケーション等はインストールしていません。 ところが、同じ環境なのに、何をしてもアプリケーション上でSQL Serverから取得した文字列が全て???と文字化けしてしまいます。 テストサーバーの設定手順はメモしておいたので、同じ手順です。再起動も何十回もしました。一旦英語OSに戻して再起動、日本語に戻すなどもやってみました。 パッケージソフトなのでソースやデーターベースの変更はしてもらえません。ソフトの再インストールやデーターベースの再インポートはしてもらいました。文字化けするのはSQLサーバーのchar型です。 SSMSの設定も確認しました。SSMS上では文字化けしません。データーベース、テーブル、カラムの照合順序の確認しましたが、テストサーバーと同じようにJapanese_CI_ASに設定されています。 ODBC経由でosqlでSELECTするとも文字化けしません。また、ODBC経由でAccessからリンクしても文字化けしません。 本稼動サーバーではアプリケーション上で何をやっても文字化けしてしまいます。 また本稼動上のアプリケーション上で、旧SQL Server 2008に接続すると文字化けしません。 文字化けするのは新本稼動サーバーのアプリケーション上でDBから取得している全ての表示です(プルダウンリスト、表示など)。新規にデーターを追加しても???で文字化けします。 Windows 2008やSQL Server2008のEnd of Supportが近づいており、パッケージソフトも購入してしまったので非常に困っています。 テストサーバーでは文字化けしないのに、何故同じ環境で構築した本稼動サーバーでは文字化けするのでしょうか? 文字化けについて経験がある方がいましたら、教えてください。

  • SQL ServerのUNICODE設定について

    SQL Server 2005を使っていますが、SJIS形式で格納された、Oracleの データを、SQL ServerのUNICODEで構成されたテーブルに、ロードする 必要があります。 Oracleでは、異なる文字コードの場合、SQL Netが自動的に、文字 コードを判断して、自動変換してくれますが、SQL Serverでは、 どのようになりますか?SQL Native Client等が、自動変換してくれる のでしょうか? お手数ですが、どなたかお教え下さい。

  • Oracle8の文字コードについて

    SolarisはEUCで、オラクルデータベースはsjisです。 この場合、Solaris上でPro*CでC言語アプリを作成した場合、日本語文字列の扱いについて特に意識する必要はあるのでしょうか? NLS_LANGの設定だけで大丈夫なのでしょうか? SQL*NETが自動で変換してくれるのでしょうか? よろしくお願い致します。

  • OracleとSQL ServerのSQL文上での差異について

    お世話になっております。 もしOracleやSQL Serverに関してご存知の方が いらっしゃいましたらご教授ください。 今、業務で 「Oracleに載せるシステムをSQL Serverで載せられないか?」 という話が出ており私が調査を行う事になりました。 しかし私のSQL Server経験が浅い為困っている点があります。 (以下の質問は当然ですがシステムで動く・動かない の話はヌキにしてのSQLレベルでの話です) ・Oracle特有のSQL構文をSQL Serverに見合った構文に 直すことによって(DATE→datetime/NUMBER→int等)一般的な SELECT文、INSERT、UPDATE、DELETE文はそのまま使う事が可能か? ・上の件に関する経験をお持ちの方・知識のある方にお聞きしますが 何かこの件に関する注意点などありますでしょうか? の2点になります。 どうかご存知の方がいらっしゃいましたらお願い致します。

  • VBでSQL-serverをプログラムする

    VBでmdbファイルを操作するプログラムを勉強していますが、データベースをサーバー管理するならば、AccessではなくSQL-serverなどを使った方が良いと聞きました。 質問なんですが、 SQL-serverには、Accessと同じようにユーザーフォームを使ってデータベースシステムを構築するような機能が付いているのでしょうか? そもそもOracle、dBase、SQL-serverといったデータベースソフトは、DBそのものを作成するソフトであって、DBシステムを構築するにはVBなどによるプログラム開発が必要なのでしょうか? 分かりにくい質問ですみません。

  • MySQL4.1 文字コードについて

    MySQL4.1を導入したのですが一部文字が入力できないときがあります。 MySQL4.0の時は不具合はおきませんでした。 MySQLのキャラクタセットはすべてsjisに設定しました。 character_set_client sjis character_set_connection sjis character_set_database sjis character_set_results sjis character_set_server sjis character_set_system utf8 MySQL・phpでサイトを構築しているのですが 入力フォームで文章が「ソ」「表」で終わると、登録に失敗します。 shift-jisの特殊文字ですので「ソ\」「表\」のようになり、SQL文のシングルコーテーションが文字列(\')と認識されると思うので下記置き換えで大丈夫かと思いましたが、また失敗しました。 $text = str_replace("\\","\\\\",$text); $text = str_replace("'","\'",$text); MySQL4.1はホントに難しいです… お分かりになる方いましたらよろしくお願いします。

    • ベストアンサー
    • MySQL
  • Access と SQL Server の接続

    20年ほど前にAccessとSQL Server Express でADPのシステムを自社用に自分で構築したのですが、多忙のためそのままになっていました。 いまさらですが、システムを再構築しようと思います。 Local で自分のコンピュータ内であれば、Access からSQLサーバに接続できるのですが、社内のネット環境内でAccessクライアントからサーバのSQLへの接続ができなくて困っています。 現バージョンのAccessからSQL Server Express への接続方法の参考書籍がありましたら、ご紹介願います。 ネットでいろいろと検索してみましたが、私にとってはキーワードが限りなく連鎖するため途方に暮れています。 宜しくお願いいたします。