新入社員奮闘記 #016「休日の勉強資料」


こんにちは、今井です。
私の今年度の目標のひとつに「勉強したことを共有する」というものがあります。今回はそれについて、先日社内で共有したドキュメントを載せたいと思います。

「家で何かをしろ」と強制されることはありませんが、この業種は「勉強し続けなければ面白い仕事にはありつけない」と思っているので、自主的に勉強するようにしています。
少しマニアックな話なので、「そんなこと勉強しているんだな~」ぐらいに考えてもらいたいです。

概要

データベースを操作するためのSQLに関する勉強資料です。
PostgreSQLでは、小文字を大文字に変えるときにUPPER関数という関数を利用して変換します。しかし、データベースの初期設定次第では全角小文字を全角大文字に変換できない、という内容です。
知っていれば間違えませんが、普段意識しないデータベースの設定が影響するのでミスしやすい箇所です。
データベースの初期設定は後から変更もできないので、すでに動いているデータベースでは別の手段での変換が必要となってきます。

ドキュメント

UPPER関数とは

SQLServer,Oracle,PostgreSQLで使える英小文字から英大文字に変換できる関数(MySQLの場合はAccess関数)

UPPER関数を使うときの注意点

ロケールの設定が[C]の場合、全角小文字が全角大文字に変換されません。
ロケールの設定が[C]の場合に全角大文字に変換する場合は、translate関数を使って無理やり変換する必要があります。
もしくはロケールの設定を日本語のja_JP.文字コードにする必要があります。

Uppercase イメージ
なんでこんな事が起こるの?

ロケールのサポートはアルファベット・並び換え・数字の書式など、文化的志向を配慮したアプリケーションを対象とするらしく標準設定の[C]では日本語を対象にしていないため、全角大文字変換ができないようです。

ロケールのカテゴリー

LC_COLLATE    文字列の並び換え順
LC_CTYPE      文字の分類
LC_MESSAGES   メッセージの言語
LC_MONETARY   通貨書式
LC_NUMERIC    数字の書式
LC_TIME      日付と時刻の書式

以上のようなカテゴリーがあり、それぞれ設定を変えて使うことができます。

データベースイメージ

今回のUPPER関数でいうとLC_CTYPEが日本語対応になっていれば正常に動くことになります。
しかし上2つはソート順にかかわるため、後から変更ができません。
そのため、業務で全角大文字に変換する場合はtranslate関数を使う必要がありそうです。

ロケール設定の影響

文字列データに対するORDER BYまたは標準の比較演算子を使用した問い合わせにおける並び替え順
UPPER、LOWER、INITCAP関数
(LIKE、SIMILAR TOやPOSIX形式の正規表現といった)パターンマッチング演算子では、ロケールは大文字・小文字を区別せず、正規表現の文字クラスによる文字の区別に影響を及ぼします。

一群のto_char関数
LIKE節が付いたインデックスを使用する性能

といった影響があるようです。とりあえずロケールのカテゴリーを意識していれば問題なさそうです。
ちなみに、公式ではデフォルト設定の[C]を推奨しています。他を使うと実行速度が遅くなるようです。

参考URL

UCASE,UPPER,LCASE,LOWER関数の動作確認を行う環境
https://db.just4fun.biz/?PostgreSQL/
ロケール(lc_ctype)の設定とロケールライブラリの実装に依存します。
https://oshiete.goo.ne.jp/qa/8057818.html
ロケールのサポート
https://www.sraoss.co.jp/PostgreSQL/Manual/document/9.6/locale.html

まとめ

このような感じで、データベース、SQL周りを中心に勉強しています。
たまにはこういうブログも書いていこうかなと思うのでよろしくお願いします。

先輩からひとこと

いよいよ門外漢の私には何のことやらちんぷんかんぷんな内容に入って参りました。休日といえばひねもす寝てばかりの私も、身が引き締まる思いで読みました。ぐう。

コメント

タイトルとURLをコピーしました