DBMS関連

Q. SELECT文による全件取得時は「㉑」以降を含んだすべてのレコードを取得できますが、WHERE 句を使っての条件抽出時は「㉑」以降を含んだレコードを抽出できません。「㉑」以降をWHERE句 で抽出する方法はありますでしょうか?

製品の種類
:実行版クリックワンス実行版開発版

サーバー上のデータ例


《⑳を取得》                《㉑を取得》

考えられる要因


 まず、丸付き数値(①など)の文字コードについて整理します。

 「①~⑳」 :シフトJISコードとUnicodeの双方に存在します。
 「⓪、㉑~㊿」 :Unicodeにのみ存在します。
 丸付き51以上 :現在ありません。

 項目「商品名」はNVARCHAR 型であるのに対して、上記のSQL文は、
 「'⑳' および '㉑'」をシフト JISで指定しています。

《項目定義》

 このようにデータ型が不一致の場合は、DBMSが「暗黙の型変換」を行います。
 暗黙の型変換(シフトJIS → Unicode)の結果
 
  '⑳' → '⑳'
  '㉑' → '' 
 シフトJISに㉑が存在しないため、正しく型変換されません。

対処方法


  比較条件などで、左辺のデータ型に右辺のデータ型を合わせるようにSQL文を記述をします。
  参考事例を掲載します。

《 参考事例》

※補足※

  暗黙の型変換は便利ですが、そもそも正常に動作しない場合があります。
  また、DBMS側が事前にその処理を実行することで、パフォーマンスに影響が出る場合もあります。
  左辺と右辺でデータ型を合わせるようにSQL文を記述することで、余計なトラブルを
  回避することできます。



*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
補足説明:MS SQL
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

オンラインヘルプの改善にご協力ください。

このページは役に立ちましたか?