目次
序文:
デジタル構築の継続的な深化に伴い、企業は企業データガバナンスにますます注目し、データ消費を通じて意思決定を支援しています。世界の新エネルギー産業における総合サービスプロバイダーとして。当社でも特殊な業務が多くあります。もちろん、どの企業もビジネスのデジタル化に遭遇するでしょうし、何らかの「ありがたいビジネス」に対処する余地を常に残しています。つまり、業務量が非常に少なく、標準化した制御には価値がありません。もちろん、これらのビジネスも完全にオンライン化されます スズメは小さいですが、内臓はすべて揃っています。その結果、包括的なビジネス分析中に、漢字を含むバッチなどの非常に迷惑な「異常なデータ」が発見されました。今回はそんな中国語+英語の「外国人バッチ」への対処法をお話したいと思います。あらゆる企業に適用できる中国語処理を要約します。
1. 自分と敵を知る
なぜ中国人は存在するのでしょうか?
1.1 ビジネスシナリオ
上図に示すように、一部のカスタマイズされた業務バッチのバッチ番号は、システムによって自動的に生成されるのではなく、手動でシステムに入力されます。システム上の制約はありますが、対応する意味を見やすくするために、中国語の文字が表示されます。必然的に追加されます。インターネット上の中国語フィルタリングに関するSQをたくさん調べましたが、正直ほとんど意味がなく、基本的にニーズに応えられないので、皆さんの時間を無駄にしないように体系的に整理していきたいと思います。必要なときに〜
1.2 エラーのケース
エラー例
select *
from table_name
where regexp_like(text_field, '[\u4E00-\u9FA5]');
誤解
上記のコードは、regexp_like 関数を使用して、文字の Unicode 値の範囲を指定して中国語の文字をフィルタリングする機能を実装しています。Unicode 値は、中国語の文字の範囲に従って設定されます。\u4E00 – \u9FA5 は、文字範囲で最も一般的に使用されます。漢字 Unicode エンコーディング テーブル 通常の状況では、ニーズを満たすことができます。
エラーの影響例
下の図に示すように、最終バッチはろ過なしの場合と同じになります。
原因分析
具体的な理由については、以前に書いた記事を参照してください。Oracle では、Unicode 範囲に基づいて中国語をフィルタリングできません。
oracle が文字列内の中国語を置き換えます_oracle が文字列内の中国語を削除します_彼らは私をテクニカル ディレクターのブログと呼んでいます - CSDN ブログ
2. アイデアの整理
2.1 ストレージ長と文字列長の比較
中国語の文字が Oracle データベースに格納される場合、1 つの中国語の文字が 2 文字以上を占めることになります。これはデータベースの文字セット エンコーディングによって異なります。通常、データベースの NLS_CHARACTERSET はAL32UTF8 または UTF8です。つまり、1 つの中国語文字が 3 ~ 4 バイトを占めます。NLS_CHARACTERSET がZHS16GBKの場合、1 つの中国語文字は 2 バイトを占めます。
上の図に示すように、漢字は 2 バイトを占めます。
したがって、最初の方法である lengthb(' Chinese') を使用することができます。=length('中国語') 中国語を含むバッチ番号を検索します。正しいケースの例を以下に示します。
コード:
--查询带中文的数据
select 生产批次号 from BI.QZ_zB_GCPJCSJ zb
where 1=1
and flag='已清洗'
and LENGTH(生产批次号)!= LENGTHB(生产批次号);--查询中文批次
--查询非中文的数据
select 生产批次号 from BI.QZ_zB_GCPJCSJ zb
where 1=1
and flag='已清洗'
and LENGTH(生产批次号)= LENGTHB(生产批次号);--查询非中文批次
効果:
解釈:
上の図に示すように、中国語の文字を含むバッチは、 LENGTH (製造バッチ番号)! = LENGTHB (製造バッチ番号)で見つけることができます。したがって、中国以外のバッチだけを見たい場合は、LENGTH (生産バッチ番号) = LENGTHB (生産バッチ番号) を使用することで目的を達成できます。
3. 他に何かアイデアはありますか?
上記では、中国語のストレージ ルールを使用して中国語のデータをフィルタリングしていますが、実際には、ASCII テーブルのルールを使用して中国語のデータをクエリすることもできます。
3.1ASCIIテーブルの検索方法
バッチ ルールには通常、数字、文字、特殊記号、漢字が含まれますが、ASCII テーブルにない文字を削除すると中国語になります。詳細については、対応する ASCII テーブルを参照してください。
具体的には、中国語を「彼らは私をテクニカルディレクターと呼んでいます。」などの、表示されない複雑な文字列に置き換えます。置き換えられた文字列に「彼らは私をテクニカルディレクターと呼んでいます」という文字が含まれているかどうかを判断すれば、それが可能です。詳細については、以下の事例を参照してください。
3.2 正式な事例
コード:
select 生产批次号
from BI.QZ_ZB_GCPJCSJ
where instr(regexp_replace(生产批次号,
'[' || chr(128) || '-' || chr(255) || ']',
'他们叫我技术总监'),
'他们叫我技术总监',
1,
1) > 0
--将中文替换为一个不可能出现的字符,然后判断替换的字符串是否包含对应的字符
効果:
解釈:
中国語を、表示されない複雑な文字列に置換し、置換後の文字列に置換後の文字が含まれているかどうかを判断します。対応する置換文字列は中国語である場合があります。
4. まとめ
この記事には、中国語を含むデータの検索、中国語以外のデータの検索、中国語を他の文字に置き換えるなど、一般的に使用される中国語処理ソリューションがすべて含まれています。もちろん、場合によっては、漢字を含む一連の文字列から数値や日付などを取得する必要もあります。たとえば、「2.2 元/ジン」の場合、単価として 2.2 が取得されます。たとえば、「2023-06-22 We are together」では、分析のために 2023-06-22 の日付が取得されます。過去に対応する処理方法を解説した記事を書きましたので、皆さんのお役に立てれば幸いです。インターネットで間違ったチュートリアルを探すことに時間を費やす必要はもうありません~