- PR -

【バグ?】SQLSERVER2005で2バイト文字が破壊される。

投稿者投稿内容
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-01-05 00:08
こんばんは。ハニワ祭りです。

最近気がついたのですが、SQLSERVER2005で

SELECT CAST('あ' AS VARCHAR(1))

というSQLを流すと、結果として 「・」 が返ってきます。
これもSQLSERVER2005のバグでしょうか?
SQLSERVER2000の時はそんなことは無かったように記憶しています。

ちなみに
SELECT CAST('あ' AS CHAR(1))
の場合、期待通り「 」(1スペース)が返ってくるようです。

よろしくお願いします。
MeijiK
常連さん
会議室デビュー日: 2005/12/26
投稿数: 24
お住まい・勤務地: 東京都
投稿日時: 2007-01-05 18:26
これって単に未定義の動作が、たまたま変わったというだけではないですか?

確かMS SQL ServerのCHAR/VARCHARの長さ指定はバイト単位なので、'あ'という
2-byteから1-byteにCASTして意味のある値は戻らないのでは?
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2007-01-07 00:25
SQL Serverのchar(n)やvarchar(n)は、バイト単位ですよ?

1バイトだけ取り出すということは、意味のないコードを取り出そうとしている
ようなもので、エラーチェックが漏れているだけかも知れません。

どんな結果を期待しているのですか?
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-01-07 13:19
引用:

忠犬さんの書き込み (2007-01-07 00:25) より:
SQL Serverのchar(n)やvarchar(n)は、バイト単位ですよ?

1バイトだけ取り出すということは、意味のないコードを取り出そうとしている
ようなもので、エラーチェックが漏れているだけかも知れません。

どんな結果を期待しているのですか?



私が期待する動作は、

@前バージョンであるSQLSERVER2000(SP4)と同様に処理されること
Acharとvarcharで2バイト文字が泣き別れするかについての仕様の統一

前バージョンとCAST関数の仕様が変わっているのであれば、MSのドキュメントに記述があること。
(個人的には無ければバグに等しいと感じます。)


また、さらに試してみたところ
 
 SELECT CAST(CAST('あ' AS TEXT) AS VARCHAR(1))
 
 SELECT CAST(CAST('あ' AS NVARCHAR(100)) AS VARCHAR(1))

のように一度VARCHAR以外の型に変換すれば、
意味の無い泣き別れ部分が切り捨てられるようです。



[ メッセージ編集済み 編集者: ハニワ祭り 編集日時 2007-01-07 13:28 ]
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2007-01-07 16:09
バグと大騒ぎする前に マニュアルちゃんと読みました?
これがバグで無い場合は、マニュアル読まずに反応するやつと思われます。

ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2007-01-07 18:07
引用:

七味唐辛子さんの書き込み (2007-01-07 16:09) より:
バグと大騒ぎする前に マニュアルちゃんと読みました?
これがバグで無い場合は、マニュアル読まずに反応するやつと思われます。





MSDN2のBooks OnlineのCAST関数についての項目には、
このあたりの動作仕様が明記されていないことは確認済みです。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2008-02-14 00:55
自己スレです。
SP2を適用した状態では、現象は再現しなくなっていました。
修正される障害の一覧にも記載されていないため、どうやらこっそり修正されたようです。
マニュアルやドキュメントに載ってないことの方が多いってことですね…
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-02-14 10:05
これは違うのかな?

http://msdn2.microsoft.com/ja-jp/library/ms187928.aspx
引用:

メモ:
SQL Server では、ここに示した形式を、記載されている CONVERT 実行後のデータ型と
組み合わせて使用できます。記載されていない形式、または組み合わせでは
使用できません。サポートされていない形式は使用しないでください。
サポートされていない形式を使用したり、形式と変換後のデータ型をサポートされていない
組み合わせで使用したりすると、エラーや信頼できない結果が返される場合があります。
SQL Server のどのリリースでもそのような結果になるとは限りません。

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