トップ回答者
2バイト文字列の分割について

質問
-
お世話になります。
2つのサーバにそれぞれSQL Server 2005 Standard Editionがインストールされているのですが、
ストアドで2バイト文字列の分割を行った際、1つのサーバで文字化けが発生します。文字化け自体はストアドの修正(DATALENGTH、LEFT、LENを使用)をおこない
回避できるようになったのですが、原因の説明を求められています。
ご存知の方がいらっしゃいましたら、ご教授ください。
SQL Serverのバージョン
文字化けしないサーバ:Aサーバ:9.00.3042.00
文字化けするサーバ :Bサーバ:9.00.1399.06
ソースの概要
Declare @wkStr1 As Varchar(200)
Declare @wkStr2 As Varchar(200)@wkstr1にカーソルで varchar(100)の項目を代入
Fetch Next From ex_cur Into @wkStr1Set @wkStr2 = @wkStr2 + CONVERT(VARCHAR(30), @wkStr1) + ':'
Aサーバは30バイト目が2バイト文字列の場合、29バイトまでで分割されますが
Bサーバは後ろの':'とあわさり文字化けします。例:ここでは30バイト目ではなく9バイト目で分割
CONVERT(VARCHAR(9), 'あいうえお') + ':'
→Aサーバ「あいうえ:」
→Bサーバ「あいうえ・」
サーバ、データベース、テーブル、項目の言語系と思われるプロパティは
すべて同じ設定で日本語になっています。よろしくお願いします。
回答
-
-
「SELECT CONVERT(VARBINARY, CONVERT(VARCHAR(30), @wkStr1))」
が「値は両方のサーバで同じでした。」ということは
「CONVERT(VARCHAR」の仕様変更ではなく、表示時の問題でしょうか。
そもそも論になってしまいますが、マルチバイト文字を nvarchar でなく
varchar で扱うことに問題があることはMSDNライブラリで教えてくれていますね。(→下記サイト)
(回避策はとられたようですが、サロゲートが問題無いかちょっと心配だったり。。)
char および varchar (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms176089.aspx
(抜粋)
サイトで複数の言語をサポートする場合は、文字変換から生じる問題を最小限にするために、Unicode の nchar 型または nvarchar 型を使用することを検討してください。char 型または varchar 型を使用する場合は、次のように使い分けます。
すべての返信
-
-
「SELECT CONVERT(VARBINARY, CONVERT(VARCHAR(30), @wkStr1))」
が「値は両方のサーバで同じでした。」ということは
「CONVERT(VARCHAR」の仕様変更ではなく、表示時の問題でしょうか。
そもそも論になってしまいますが、マルチバイト文字を nvarchar でなく
varchar で扱うことに問題があることはMSDNライブラリで教えてくれていますね。(→下記サイト)
(回避策はとられたようですが、サロゲートが問題無いかちょっと心配だったり。。)
char および varchar (Transact-SQL)
http://msdn.microsoft.com/ja-jp/library/ms176089.aspx
(抜粋)
サイトで複数の言語をサポートする場合は、文字変換から生じる問題を最小限にするために、Unicode の nchar 型または nvarchar 型を使用することを検討してください。char 型または varchar 型を使用する場合は、次のように使い分けます。