sqlplus でスクリプトを実行すると、作成者は誤って判断されやすいエラーに遭遇しました。ORA-01756: quoted string not properly terminated。一見、SQL の引用符が間違って記述されているように見えますが、実際には、お客様の環境における変数の設定に問題があります。以下では、再発実験を使用してその理由を説明します。
01 |障害の再発
まず、お客様の環境の設定に応じて、 NLS_LANG GBK 文字セットとして指定します。
$ export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
sqlplus を入力した後、中国語を含むクエリを実行します。
SQL> SELECT '通用智能体' FROM dual;
ERROR:
ORA-01756: quoted string not properly terminated
SQL 自体には引用符の問題はありませんが、「引用符が正しく終了していません」と報告されます。終了後、変数を UTF-8 に変更します。
$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
同じステートメントを再度実行すると、結果が通常どおり返されます。
SQL> SELECT '通用智能体' FROM dual;
'通用智能体'
---------------
通用智能体
ターミナルでは、実際のエンコーディングは UTF-8 です ( locale 確認前提)、同じ端末、同じSQL、変更しただけ NLS_LANG結果はまったく異なります。これは、sqlplus がクライアントの文字セットが端末のエンコーディングと一致しているかどうかに非常に敏感であることを示しています。
02 | NLS_LANGとは何ですか
NLS_LANG Oracle クライアント ツール (たとえば、 sqlplus、sqlcl、expdp など)、クライアントの言語、地域、文字セットを定義するために使用されます。標準形式は次のとおりです。
语言_地域.字符集
例えば AMERICAN_AMERICA.AL32UTF8。
文字セット部分は、クライアント側で文字セットを宣言するために使用されます。クライアント ツールは、それに応じて端末の入力と出力とデータベースの文字セットの間で変換を行います。実際には、端末の実際のエンコーディングと一致している必要があります。そうでないと、文字化けや解析例外が発生しやすくなります。
03 |なぜ引用符が発生するのでしょうか?
重要なのは、文字セットが端末の実際のエンコーディングと一致しているかどうかです。
Linux環境ではターミナルエンコーディングを渡すことができます locale 共通の値は UTF-8 であることを確認してください。端末が実際に UTF-8 である場合、 NLS_LANG に設定されています ZHS16GBKsqlplus は、GBK ルールに従って UTF-8 バイト ストリームを解析します。中国語の文字はマルチバイトであるため、エンコード ルールが一貫していない場合、バイトの位置ずれが発生します。一重引用符の境界さえ認識できない場合があり、最終的にはエラー メッセージがスローされます。 ORA-01756。
したがって、このエラーは必ずしも SQL が正しく記述されていないことを意味するわけではなく、クライアントの文字セットが端末のエンコーディングと一致していない可能性もあります。
04 |伝統的なツールと最新のツールの違い
伝統 sqlplus 最下層は C/C++ ですが、コーディングの影響を非常に受けやすく、耐障害性がありません。設定に一貫性がない場合、問題が発生しやすくなります。
そして現代的 sql / SQLcl は Java に基づいて実行され、一部のシナリオでは入力ストリーム処理に対する耐性が高くなります。しかし、 NLS_LANG 端末のエンコーディングと一致しない場合でも、その動作は特定のバージョンと動作環境に依存します。使用するバージョンの公式ドキュメントと実際のテスト結果を参照することをお勧めします。
05 |実践的なアドバイス
Linux 環境で日常の運用とメンテナンスを行ったり、自動スクリプトを作成したりする場合は、明示的な設定を一律に行うことをお勧めします。
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
クライアントの文字セットを端末のエンコーディングと一貫性を保つことで、 sqlplus、expdp/impdp 他のツールでのコーディングの問題。非 UTF-8 環境での直接適用を避けるために、データベースの文字セットと端末のエンコーディングを組み合わせて実際の設定を確認する必要もあります。
私に従ってAIと一緒に成長してください~