このBlogをご覧になられている皆様も一度ぐらい『全角vs半角』に巻き込まれたことがあるのではないでしょうか? 私も懲りずにまたこの戦いに挑んだのでその内容を・・・
やりたいこと
オブジェクトAとオブジェクトBの突合せ(N:M)を実施し、実施結果をオブジェクトCに更新する。 以下のStepで実装します。
①オブジェクトAから対象となるレコードを抽出
②①の抽出結果から『突合せKey』のSetを作成
③②の『突合せKey』を条件にオブジェクトBを抽出
④③抽出結果をMapに格納
⑤突合せの実施
⑥突合せ結果をオブジェクトCにUpsert(外部IDとして『突合せKey』を利用)
②①の抽出結果から『突合せKey』のSetを作成
③②の『突合せKey』を条件にオブジェクトBを抽出
④③抽出結果をMapに格納
⑤突合せの実施
⑥突合せ結果をオブジェクトCにUpsert(外部IDとして『突合せKey』を利用)
ガバナ制限を考慮して、各レコードをMapに格納して突合せを実施します。
1.SOQLの戦い(③の処理)
SOQLでは全角/半角のアルファベット・数字は区別されません。 但し全角/半角のカタカナは区別されます。
2.Apexの戦い(④⑤の処理)
- ・Mapのget/containsKeyメソッドの比較等では、全角/半角は区別されます。(アルファベット、数字、カタカナとも)
- ・『==』演算子でStringを比較する場合は、全角/半角のアルファベット・数字は区別されません。
3.外部IDの戦い(⑥の処理)
Upsert時の外部IDは全角半角は区別されません。(アルファベット、数字、カタカナとも)
まとめ
記号も含めて確認したところ、以下のようになっていました。(Winter'14/API29.0で検証)
カタカナに関してはSOQLでは区別されるのに対し、Upsert時には区別されません。
※1 外部IDの設定では大文字小文字の区別ができますので、全角半角と合わせて大文字小文字も取扱注意です。
※2 今回の検証では以下の記号で、SOQL、外部IDともに区別されました。 『"』と『"』 『・』と『・』
『①』と『1』 『ー』と『‐』など、まだ気になるペアがあります。 可能な限り突合せのKeyとなる項目の入力可能な文字は制限してくほうがシステム的には望ましいですね。
検証コード
検証したApexコードです。 カスタムオブジェクト(ObjectB__c,ObjectC__c)にそれぞれexternalId__cというテキスト型の外部ID項目を作成しています。 検証のために一部ループの中でDML発行していますが、ご了承ください。