2

これは、Oracle SQL クエリからのものです。アポストロフィが必要な場所に、データベース内のこれらの奇妙な細い長方形の形状があります。(ここにスクリーンショットを貼り付けたいと思います)

結果をコピペするとこんな感じ。

spouse�s

フィールドでこの文字を検索し、結果でアポストロフィに置き換える SQL SELECT ステートメントを作成する方法はありますか?

編集:レポート目的で SELECT ステートメントの結果のみを変更する必要があり、データベースを変更することはできません。


私はこれを実行しました

デュアルからダンプ('�')を選択;

戻った

Typ=96 Len=3: 239,191,189

これは今のところうまくいくようです

select translate('あなたの配偶者のファーストネームは何ですか?', '�', '''') from dual;

しかし、これは機能しません

テーブル名からtranslate(Fieldname, '�', '''')を選択


TNからFNを選択

あなたの配偶者のファーストネームは何ですか?

TNからSELECT DUMP(FN, 1016)

Typ=1 Len=33 CharacterSet=US7ASCII: 57,68,61,74,20,69,73,20,79,6f,75,72,20,73,70,6f,75,73,65, 92 , 73,20,66,69,72,73,74,20,6e,61,6d,65,3f


編集:だから私はそれがバッククォート文字であることを確立しました。DBを更新できないので、このコードを試しています

TN から REGEX_REPLACE(FN,"\0092","\0027") を選択

ORA-00904:"Regex_Replace":invalid identifier が表示されます

4

5 に答える 5

6

これは、文字セットの設定に問題があるようです。NLS_LANG およびその他の NLS_xxx 環境/regedit 値を確認してください。Oracleサーバー、クライアント、およびそのデータの挿入者のクライアントを確認する必要があります。

値をダンプしてみてください。次のような単純な選択でそれを行うことができます:

SELECT DUMP(the_column)
  FROM xxx
 WHERE xxx

更新:交換を試みる前に、問題の根本を探すと思います。文字セットの問題が原因でこれが発生した場合、不正なデータで大きな問題が発生する可能性があります。

更新 2 : コメントへの回答。問題はデータベース サーバー側ではなく、クライアント側にある可能性があります。問題 (これが問題である場合) は、サーバーからクライアントへの通信の変換である可能性があります。これは、サーバーとクライアントの不適切な構成調整のためです。たとえば、サーバーが UTF8 文字セットを定義していて、クライアントが US7ASCII を使用している場合、すべての急性記号は ? として表示されます。

別のアプローチとして、サーバーが UTF8 文字セットを定義し、クライアントも UTF8 を定義しているが、アプリケーションが UTF8 文字を表示できない場合、問題はアプリケーション側にあります。

更新 3 : あなたの例:

  • select translate('What. � がまったく同じ文字であるため、機能します。両側に貼り付けました。
  • select translate(Fieldname. はデータベースに保存されていないため機能しません。クライアントが受け取る文字は、表示されるまでデータテーブルから何らかの変換が行われる可能性があるためです。

次のステップ: DUMP構文を調べて、不思議な char のコードを抽出してみてください (貼り付けていない表から �!)。

于 2009-07-16T21:43:56.597 に答える
2

キャラクターがシングルティックの「スマートクォート」である可能性は十分にあると思います(名前が嫌いです)。スマート クォートは、文字 91 ~ 94 (Windows エンコーディングを使用)、または Unicode U+2018、U+2019、U+201C、および U+201D です。

于 2009-07-16T21:51:50.310 に答える
1

この問題に対して、フロントエンド アプリケーション ベースのクライアント側アプローチを提案します。

この問題は、配偶者の単語を表示しようとしているフォントと文字の不一致に関係していると思われます. このアイコンは、文字コードのグリフを持たない Unicode フォントで文字を表示しようとすると表示されます。

Oracle データベースは、列に INSERT された文字を忠実に返します。アプリケーションでデータを表示しようとしているフォントが与えられたときにどのように見えるかを解釈するのは、あなたとあなたのアプリケーション次第です。そのため、アポストロフィを置き換えているこの不思議な � 文字が何であるかについて調査することをお勧めします。まず、FerranB の推奨する DUMP() を使用します。

次のクエリを実行して、文字コードを取得してみてください。

SELECT DUMP(<column with weird character>, 1016) 
FROM <your table> 
WHERE <column with weird character> like '%spouse%';

それでもデータベースから実際のテキストを取得できない場合は、WHERE 句を変更して問題のある列を実際に取得する必要があります。

文字のコードを見つけたら、組み込み関数regex_replace()を使用して、文字の生の 16 進コードを特定し、ASCII / C0 コントロールと基本ラテン文字 0x0027 ( ')、次のようなコードを使用:

UPDATE <table>
    set <column with offending character> 
            = REGEX_REPLACE(<column with offending character>,
                            "<character code of �&gt;",
                            "'")
WHERE regex_like(<column with offending character>,"<character code of �&gt;");

Unicode やさまざまな文字エンコーディング方法に慣れていない場合は、Joel の記事The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)を読むことをお勧めします。その記事を読むまで、私はそうではありませんでした。


編集: 0x92が表示されている場合は、ここに文字セットの不一致がある可能性があります:

CP-1252 (デフォルトの Windows コード ページ) の 0x92 は、アポストロフィのようなバッククォート文字です。このコードは有効な ASCII 文字ではなく、IS0-8859-1 でも有効ではありません。したがって、おそらくデータベースが CP-1252 エンコーディングであるか (その可能性は低い)、CP-1252 をスポークするデータベース接続がそれを挿入したか、何らかの形でアポストロフィが 0x92 に変換された可能性があります。データベースは CP-1252 (または 0x92 が有効な他の文字セット) で有効な値を返していますが、db クライアント接続は CP-1252 を想定していません。したがって、奇妙な疑問符。

そして、FerranB はおそらく正しいでしょう。問題を解決するために、これについて DBA または他の管理者に相談します。できない場合は、上記の更新を行うか (できないようです)、次のようにします。

INSERT (<normal table columns>,...,<column with offending character>) INTO <table>
SELECT <all normal columns>, REGEX_REPLACE(<column with offending character>,
                             "\0092",
                             "\0027")  -- for ASCII/ISO-8859-1 apostrophe
FROM <table>
WHERE regex_like(<column with offending character>,"\0092");

DELETE FROM <table> WHERE regex_like(<column with offending character>,"\0092");
于 2009-07-16T21:38:55.657 に答える
0

これを行う前に、実際に何が起こったのかを理解する必要があります。誰かが非ASCII文字列をデータベースに挿入したようです。たとえば、Unicode または UTF-8 です。これを修正する前に、これが実際にバグであることを十分に確認してください。アポストロフィには、"'" だけでなく、さまざまな形式があります。

于 2009-07-16T21:43:48.687 に答える
0

TRANSLATE() は、既知の単一文字コードを置換または削除するための便利な関数です。

于 2009-07-17T13:07:19.830 に答える