2012-01-09 17 views
0

アプリケーションがデータベースから特殊文字を読み取っているかどうかをテストし、まったく同じ方法で表示する必要があります。このためには、使用可能なすべての特殊文字をデータベース表に移入する必要があります。しかし、私はどのようにSQLの挿入クエリで特殊文字を指定できるかわかりません。誰も私がクエリに特殊文字を挿入できる例に案内してくれますか?簡単にするために、テーブルがAreaとAvg_Temperatureが2つの列であるCityテーブルであるとします。 Avg_Temperature列に度(celcius/farhenheit)記号を挿入する必要がある場合は、どのようにクエリを書く必要がありますか?特殊文字を入力すると、Oracleテーブルでエラーが発生する


* [14:50 ESTで2012年1月9日の編集] *以下ジャスティン洞窟の提案を1として、私は以下の分析を行った:

表:create table city(area number, avg_temperature nvarchar2(10));

日: insert into city values (1100, '10◦C');

Query: 
select dump(avg_temperature, 1010) from city where area = 1100; 

O/P 
DUMP(AVG_TEMPERATURE,1010)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
---------------------------------------------------------- 
Typ=1 Len=8 CharacterSet=AL16UTF16: 0,49,0,48,0,191,0,67                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

Query 
select value$ from sys.props$ where name='NLS_CHARACTERSET'; 

O/P 
VALUE$ 
---------------- 
WE8MSWIN1252 

Query: 
select value$ from sys.props$ where name='NLS_NCHAR_CHARACTERSET'; 

O/P 
---------------- 
AL16UTF16 

インサートは、ジャスティン洞窟suggesteとして台無しに特殊文字をしているようですd。しかし、なぜこれが起こっているのか理解できません。誰でも関連提案を提供してもらえますか?

+0

データベースの文字セットとは何ですか?各国の文字セットとは何ですか?データをVARCHAR2列にロードしていますか?またはNVARCHAR2列?キャラクタはデータベースキャラクタセットに存在しますか? –

+0

@JustinCave:データベースキャラクタセット:WE8MSWIN1252;ナショナルCS:AL16UTF16。 NVARCHAR2にデータをロードしています。キャラクターセットにキャラクターが存在するかどうかわかりません!私は既存のデータベースにapplcnを構築するように言われているので、私はこれらの問題にぶつからないようにしたいと思っていました。上記のキャラクタセットで許可されている文字を見つけることができる場所を教えてください。 –

+0

@ darkie15:UTF16を使用している場合、人類にはほとんどすべての文字が含まれていても問題ありません。実際の問題は、クライアントからサーバーへの転送(およびインポートファイル、Webページ、電子メールなどのすべての中間ステップ)です。 –

答えて

1

まず、シンボルを列の一部として保存しないでください。それはあなたに長期的に問題の多くを与えるであろうVARCHARとして列を宣言する必要があります(それらの上に例えばあなたが合計することはできませんが()、あなたは(AVGすることはできません)その上など)

あなたは保存する必要があります温度が第2列(例えば、1 =摂氏および2 =華氏)で取られた単位であり、フロントエンドにデータを表示するときにこれを翻訳する。あなたが本当にシンボルを格納する場合、CHARとして単位列を宣言(1):

CREATE TABLE readings 
(
    area    number(22), 
    avg_temperature number(10,3), 
    units    varchar(2) 
) 

次のようにその後、あなたはそれを挿入することができます。

INSERT INTO readings 
(area, avg_temperature, units) 
VALUES 
(1000, 12.3, '°C'); 

しかし、再び:私は保存するためにお勧めしません実際のシンボル。コードだけを保存してください!

+0

あなたの提案をありがとうございますが、問題は度合いの記号がほんの一例であることです。私たちは実際にクライアントからこのデータを受け取っており、それには多くの特殊文字(度記号を含む)が含まれています。あなたのソリューションが実際のシナリオに合っているかどうかはわかりません。 –

+0

それでは本当の問題は何ですか?度記号を挿入する方法の例を示しました。 –

1

まず、データベースの文字セットが何であるかを知る必要があります。次に、あなたの "クライアント"接続が使用している文字セットを知る必要があります。これらが同じであれば、人生はいつもより簡単です。

あなたのdatabseがutf-8でクライアントがutf-8の場合、エスケープする必要はありません。希望の文字にutf-8エンコーディングを使用するだけで済みます。

例では、度数記号はユニコードコードポイントu + 00b0です。

utf-8では、これは2バイトのシーケンスです:x'c2 '、x'b0'。

+0

"特殊文字を入力している間にデータベースのエンコードがうまくいかないのですか?"ではない正確に。上記の情報によれば、データベースレベルでWindows-1252文字セットエンコーディングを使用しています - この文字セットは、標準ASCIIセットである0-127文字と、コードページ定義で定義された128-255文字から構成されます。 SQLDEVELOPERクライアントがUTF-8エンコーディングを使用するように設定されている場合は、1バイト、2バイト、3バイトまたは4バイトのエンコーディング(文字に依存)でUNICODE文字セット(何千もの文字)が使用されます。 –

+0

続行 - Windows-1252文字セットと同じように、標準ASCII文字(0-127)はUNICODEと同じです(UTF-8では1バイトとしてエンコードされます)。なぜなら、 ASCII文字。 SQLDeveloperの "環境"エンコーディングをwindows-1252に切り替えます。データベースとクライアントの両方が同じ方法でエンコーディングされるので、うまくいくはずです。最終的には、お客様の顧客にデータベースのサポートを保証するためにデータがどのようなエンコードであるかを尋ねる必要があります。 –

関連する問題