- PR -

クエリパラメータでNvarchar(1)の項目に数値を登録

1
投稿者投稿内容
コアラ
会議室デビュー日: 2004/12/21
投稿数: 4
投稿日時: 2007-06-30 01:05
御世話になっております。久しぶりに質問させていただきます。

SQLServer2005のNvarchar(1)の項目は2バイトではありますので、
この型の項目に数値でも16とかの2桁でもこの範囲を超えない値なら
たぶん登録可能だろうという職場のベテランの方の意見があります。

ADO.NETよりクエリパラメータで登録してみると、16の値の場合、
どうも"1"で登録されているようでした。
Convert.ToStringで"16"に変換した値をつっこむとエラーになりますが、
数値をこの型のクエリパラメータにセットすると上記のように
エラーにはなりませんが、変な登録になるのでしょうか?
発想がおかしいなら、無理です!と諦めさせたいので、
ご教授願えたら幸いです。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-06-30 20:07
結局、何を訊きたいのかを私が理解できていませんが、nvarchar(1) のフィールドに数値を入れてもあまり有用ではなさそうですね。
nvarchar(1) の 1 はあくまで「1文字」の意味だと思いますよ。
職場のベテランの「16 が登録可能できたとして、それで何がしたいんですか?」と訊いてみてはいかがですか?
_________________
囚人のジレンマな日々
大ベテラン
会議室デビュー日: 2006/06/28
投稿数: 116
投稿日時: 2007-06-30 23:53
引用:

コアラさんの書き込み (2007-06-30 01:05) より:
SQLServer2005のNvarchar(1)の項目は2バイトではありますので、


ですね。

引用:

この型の項目に数値でも16とかの2桁でもこの範囲を超えない値なら
たぶん登録可能だろう


バイト数が云々は関係なく、文字数ですから。
囚人さんの回答にもありますように、1文字の領域に2文字入れるのは・・・・・・
(「たぶん」ということで、ベテランの方も確認中かも。
来週の頭にでも情報が得られるかもしれませんね。)

引用:

ADO.NETよりクエリパラメータで登録してみると、16の値の場合、
どうも"1"で登録されているようでした。


SQL Server2005での型変換について以下のページに情報がありました。
http://technet.microsoft.com/ja-jp/library/ms187928.aspx

クエリ中の数値の型として暗黙的に何が使用されるのか判っていないのですが、
エラーになっていないところからみて、暗黙の型変換が行われた上で
切捨てが行われています。

引用:

変な登録になるのでしょうか?
発想がおかしいなら、無理です!と諦めさせたい


素直に考えると、無理ではないでしょうか。
Cluster
ぬし
会議室デビュー日: 2003/03/06
投稿数: 289
お住まい・勤務地: 大阪
投稿日時: 2007-07-01 11:52
引用:

SQLServer2005のNvarchar(1)の項目は2バイトではありますので、
この型の項目に数値でも16とかの2桁でもこの範囲を超えない値なら
たぶん登録可能だろうという職場のベテランの方の意見があります。



たぶん、ベテランの方が勘違いされているのではないかと・・・。
NCHARやNVARCHARは、文字列をUnicodeで格納します。
で、Unicodeは、「全て」の文字を1文字当たり2バイトで表現します。
たとえ、SJISやutf-8では1バイトで表示されていた"a"や"1"でも、Unicodeでは2バイトです。
なので、NVARCHAR(1)のカラムには半角数字であっても1文字しか入りません。それがディスク上で2バイト占有するかどうかと、格納する文字数は別物です。

というので答えになってますか?
コアラ
会議室デビュー日: 2004/12/21
投稿数: 4
投稿日時: 2007-07-01 17:22
囚人さん、暁さん、Clusterさんありがとうございます。

文字列を格納する為のNVARCHARに対して、数値を入れようと言うのが
無理があったようですね。

C言語とかでchar型変数に1バイトの数値型(0〜255)の値を格納できると
聞いたことがありますが、同じ発想でNVarechar(1)にも16とか128とかの
数を入れて取り出せると考えられたっぽいのですが、暁さんの言われるように

>エラーになっていないところからみて、暗黙の型変換が行われた上で
>切捨てが行われています。

となっているようですね。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-07-02 01:49
引用:
同じ発想でNVarechar(1)にも16とか128とかの
数を入れて取り出せると考えられたっぽいのですが

(char)128
とかすれば文字コード128の文字が格納できると思いますが、やはり「それで何がしたいんですか?」
と思います。数値を格納したいなら数値型の列を定義すればいいんじゃないですか?

#DBの定義を変えたくなくて、でも数値を登録したくて、「ちょうどいいや、ここにいれちゃえ」
#って話だったら、個人的には絶対に回避したいところです。保守性悪いしバグの元になるだけですから。。
1

スキルアップ/キャリアアップ(JOB@IT)