親子におすすめの新型プラネタリウムとは?

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

根本的にはシステム構築する上で『極力文字化けに遭遇したくない』思い出このような質問をさせていただきました。
『文字化け』について注意点などありましたら合わせてコメントいただければ助かります。
以上よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

Windowsのロケールの設定を日本語にした状態でSQLServerをインストールした場合、cp932がデフォルトの照合順序になります。

照合順序については参考URLをご覧下さい。

SQLServerではわかりませんが、PostgresではJDBCドライバ部分で変換していたように記憶しています。ODBCドライバではAutoTranslateという機能があります。

このため、ODBC接続で何も考えずにvarcharを使用するとcp932になります。

参考URL:http://www.microsoft.com/japan/msdn/sqlserver/sq …
    • good
    • 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文字きっかり保存できます。
    • good
    • 4
この回答へのお礼

tantanaさん回答ありがとうございます。
データ型によって内部でのキャラクターセットが異なる点理解しました。
ついでに以下の点についても教えてください。
「日本語環境の場合」と条件を記載されておりますが、
具体的には「何を持って」日本語環境となるのでしょうか?

またDB内部のキャラクタセットと、クライアント側のキャラクタセットが
異なる場合(例:VARCHARのデータをJDBCにてアクセスするような場合)
MS932→Unicode(UTF02?)への変換は何処で行われるのでしょうか?
ご存知であれば教えてください。

困り度を「暇なときにでも」としたせいか、
私の質問が的を外しているのか、どなたからも
コメントがなく不安でおりました。
tantanaさんのコメントに内心かなりホッ!としています。
ありがとうございました。

お礼日時:2007/10/16 19:41

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQL Serverで文字コードUTF-8

こんにちわ。
いつも拝見しております。

PHPでODBC接続によるSQL Serverへの問い合わせを行う部分でエラーが出て困っております。

odbc_exec()[function.odbc-exec]:SQL error:[Microsoft][ODBC SQL Server Driver][SQL Server][文字化けしたSQL文]SQL state 37000 in SQLExecDirect in C://.......

SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。

SQL文は下記のように日本語となっております。
$str = "select 担務,部課 from group by id";

解決策がありましたらご教示下さい。

よろしくお願い致します。

Aベストアンサー

>SJISの時は問題なかったのですがcharsetや保存形式をUTF-8に統一してから出るようになりました。
SQL Serverの文字コードはUTF-8になっているということでしょうか。
また、PHPのマルチバイト文字関連の設定を詳しく教えてください。

QMS SQLServer のSQLで文字列の前にN:

MS SQLServer のSQLで文字列の前にN: をつけることをよく見かけますが、
「N:」とはいったいどんな意味なのでしょうか?
教えて下さい。

Aベストアンサー

T-SQLでの話かと思いますが・・・。NCHAR/NVARCHAR型という、型(タイプ)があるのですが、これらは、夫々、national character/national character varying(SQL-92での表記法)の意味を持っています。夫々、固定長文字列(Unicode)/可変長文字列(Unicode)です。
NVARCHARはSQL-Server2000では4000文字まで、VARCHAR2は8000文字まで格納可です。(つまり、1/2になるということです)

さて、N'***' とT-SQL内で書くと、''内の文字をUnicodeで表現されたものとして処理する、という意味になります。Nは、nationalの略です。ですから、日本語を使おうとするとNは必須になる、という事ですね。

こんな感じでつかいます。#N'Unicode 文字列'

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QSQLサーバから、項目の属性(型)を取得したいのですが・・・

SQLサーバからテーブルの項目名、属性(型)を取得するには、どのように
クエリを組めば良いのでしょうか?

Aベストアンサー

2つ前の質問に書いたのと一緒ですが。。
基本的にsys.objects, sys.columnsというシステムビューを使います。

select object_name(object_id),name,type_name(user_type_id) from sys.columns c
where object_id=object_id('テーブル名')

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q処理件数を非表示にしたい

ManagementStudioでストアドプロシージャの開発をしています

開発中、デバッグのためにプロシージャをコールすると、SQLの発行の度に
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
「何件処理されました。」
・・・

と処理件数が表示され、確認の際に邪魔で困っています。
処理件数を非表示にするにはどうすれば良いでしょうか?

また同様に、SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にできないでしょうか?

Aベストアンサー

処理件数を非表示にする方法

⇒SELECT文の前に「set nocount on」を記載すると件数は表示されません。

SELECT文の発行ごとにSELECT結果がグリッドに表示されるのを非表示にする方法

⇒デバッグのためには表示された方が良いと思いますが、
 とりあえず…SELECT文の前に「SET NOEXEC ON」を記載するとデバッグだけ実施され、
 グリッドは表示されません。
例であげると以下のとおりです。
SET NOCOUNT ON
SET NOEXEC NO
SELECT *
FROM DB.dbo.TableName
go

Q更新ロックとデッドロック

データベースを勉強中の者です。ロックの種類についてどなたかご教示いただけますでしょうか。

ロックの種類は、次の三種類ですよね。

・共有ロック
・排他ロック
・更新ロック

共有ロックの意味は理解できていると思うのですが、更新ロックがよくわかりません。
更新ロックにすると次のように動作するそうですね。

1.更新を前提にして共有ロックをかける。
2.更新する前に排他ロックに切り替わる。

排他ロックも更新時に使うロックですが、排他ロックと更新ロックの違いというか、使い分けがよくわかりません。
データを更新するためには排他ロックをかけないといけないのはわかりますが、その前に共有ロックをかける意味は?

http://f29.aaa.livedoor.jp/~snaka/PukiWiki/PukiWiki.php?SQLServer%2F%A5%ED%A5%C3%A5%AF#na5d5d64

上のサイトを読んで「デッドロックを回避するため」といったんは理解したのですが、上司は「更新ロックとデッドロックは関係ない」と言います。

私の解釈が間違っているのでしょうか。それとも上司?

データベースを勉強中の者です。ロックの種類についてどなたかご教示いただけますでしょうか。

ロックの種類は、次の三種類ですよね。

・共有ロック
・排他ロック
・更新ロック

共有ロックの意味は理解できていると思うのですが、更新ロックがよくわかりません。
更新ロックにすると次のように動作するそうですね。

1.更新を前提にして共有ロックをかける。
2.更新する前に排他ロックに切り替わる。

排他ロックも更新時に使うロックですが、排他ロックと更新ロックの違いというか、使い分けがよくわかり...続きを読む

Aベストアンサー

sqlcmdのプロンプトを二つ立ち上げて
(トランザクション1)
begin tran
go
select * from テーブル with ( updlock ) where 条件
go

(トランザクション2)
update テーブル set 項目 = ~ where 条件
go

として見てください。トランザクション2は待ちになります。
トランザクション1のselect文の with ( updlock ) を取ると待ちになりません。

QEXISTSを使ったDELETE文

「SELECT文の件数」と、
「同じSELECT文を使ったDELETE文の件数」が一致しない現象が起き、困っています。

【SELECT文】※2件返ってきます。
SELECT
  a.部署コード,
  a.社員コード
FROM
  社員マスタ a,
  組織マスタ b
WHERE
  a.部署コード = b.部署コード


【DELETE文】※50件 DELETEされます。
DELETE TABLE
  社員マスタ
WHERE
  EXISTS
  (
  SELECT
    a.部署コード,
    a.社員コード
  FROM
    社員マスタ a,
    組織マスタ b
  WHERE
    a.部署コード = b.部署コード
  )


環境はSQLSERVER2005です。
件数はSQLSERVER2005のカウントオプションで表示されているものなので間違いないです。

宜しくお願いします。

Aベストアンサー

EXISTS 句は、副問い合わせが行を返した場合 TRUE そうでない場合 FALSE と評価されます。

例示いただいた副問い合わせは TRUE を返すので DELETE されます。

詳細については、SQLの入門書を参考にしてください。

Q日付型のフィールドに空白を入れる方法を教えてください

ASP(VBScript)でSQLサーバにINSET INTO文を使ってデータを格納しているのですが、日付の部分がNULLの時、「1900/1/1」が入ってしまいます。
そのまま、空白を入れる方法はどうやったらよろしいのでしょうか?

TABLE1の内容は
番号|内容|日付です。

INSERT INTO TABLE1 VALUES ( 1, 'あいう', '')

結果
1|あいう|1900/1/1

Aベストアンサー

あとは、プログラムの書き方次第ですね、、、


If hensu=Null Or hensu="" Then
dt = "NULL"
Else
dt = "'" & hensu & "'"
End IF

E_SQL = "INSERT INTO TABLE1 VALUES & _
"( 1,'あいう', " & dt& ")"
の様に書きます。

Q既定のインスタンスと名前付きインスタンス

Microsoft SQL Server 2012 をインストールしたいのですが、
既定のインスタンスと名前付きインスタンスのどちらを選べばいいのでしょうか?
SQLサーバーは初心者です。

Aベストアンサー

SQL Server は同一マシン上にいくつもインストールすることができる。
SQL Server は DB を管理するサービス (DBMS) なので、同一マシンに複数インストールすれば、同一マシンで複数の DBMS が稼動することになる。
1つめの DBMS で管理されている DB-A という DB があったとして、さらに 2つ目の DBMS にも DB-A という DB があったとしても、1つ目の DBMS で管理している DB-A と 2つ目の DBMS で管理している DB-A は別物である。

これは Windows のフォルダーで考えればわかりやすい。
1つのマシン上には複数のドライブ (C とか D とか) をマウントできる。
各ドライブには当然ながらフォルダーがあるが、C:\hoge と D:\hoge という 2つの同じ名前のフォルダーはドライブが違うので別物である。

で、本題。
同一マシン上に複数の DBMS をインストールする場合、それぞれの DBMS のインスタンスに名前をつけて区別する。
ただし 1つの DBMS しか稼動させない場合は名前をつける必要がない。これを 「既定のインスタンス」 と呼ぶ。
既定のインスタンスが稼動しているマシンに 2つ目の DBMS をインストールする場合、すでに稼動している既定のインスタンスと区別するために何か名前をつける必要がある。これが 「名前付きインスタンス」 である。

ただし DBMS を 1つしか稼動させない場合でも、何が何でも既定のインスタンスにしなくてはならないわけじゃなく、名前をつけてやってもかまわない。

例外として、SQL Server の無償版である Express Edition は、通常は名前付きインスタンスとしてインストールされる。
名前付きインスタンスを指定せずにインストールした場合は、既定の名前付きインスタンスである SQLExpress が使用される。

SQL Server は同一マシン上にいくつもインストールすることができる。
SQL Server は DB を管理するサービス (DBMS) なので、同一マシンに複数インストールすれば、同一マシンで複数の DBMS が稼動することになる。
1つめの DBMS で管理されている DB-A という DB があったとして、さらに 2つ目の DBMS にも DB-A という DB があったとしても、1つ目の DBMS で管理している DB-A と 2つ目の DBMS で管理している DB-A は別物である。

これは Windows のフォルダーで考えればわかりやすい。
1つのマシン上には複数...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング