UTF-8で"~" は EFBD9E
"?" は E3809C です。
Oracle xe での話
普通に VBなり C#なりの言語で
insert into work(str) values('~')
で挿入して
select str from work
で取得しても、なんにも問題化しません。
SQL*Plus で
insert into work(str) values('~')
を実行し、
select str from work
で取得しても、なんにも問題化しません。
ところが、SQL*Plusで
insert into work(str) values('~')
を実行し、言語で
sql = "select str from work"
cmd.CommandText = sql
Dim dr As Oracle.DataAccess.Client.OracleDataReader = cmd.ExecuteReader()
Dim dt As New DataTable
dt.Load(dr)
Dim x As String = dt.Rows(0)("str").ToString
Debug.Print(x)
を実行すると
xは "?" になるのです。
パッと見は、同じ字に見えるので見過ごすとこでした。
たまたま、あるはずのデータがヒットしないので、追及していくと、上記の文字化けが原因でした。
データインサートをSQL*PLUSて行った分でした。
よりによって、類似した字に化けるとは、意図的というかギャグとしか思えない。
UTF-8=>SJIS=>UTF-8 などのコード変換に起因するものでしょうか...?
SQL_Serverでは発生しないので、SQL*Plus上のコード変換が原因かもしれません。
個人端末のXE環境での出来事なので、他の環境では未確認です。
しかし、コードのエンコード如何で文字が化けるのは不可避とはいえ、問題ありですね。
①などの機種依存字ならまだしも、"~"の通常の文字で化けるのは不思議です。
他にも化ける文字があるとみていいでしょうね。