お世話になっております。
表題の件につきまして知見お持ちの方、いらっしゃいましたらご教授頂けませんでしょうか。
環境
【postgresql】→ODBC→【Alteryx データ入力ツール】
→ODBC→【SQL MK2クライアントツール】
ご相談内容
Postgresqlからテーブル参照時に、
SET client_encoding TO sjis;
を指定して、テーブルレコードを読み込みたいと考えています。
SQL MK2クライアントツールで
SET client_encoding TO sjis;
SHOW client_encoding;
SELECT * FROM tb1;
と記載し、実行する限りでは文字化けなく読み取ることができているのでSQLステートメントには問題ない認識です。
Alteryx デザイナーのデータ入力ツールで、DCMを使用せずにODBC接続にてテーブル参照を試みておりますが
(1)「テーブルまたはクエリ」にSET文とSELECT文の2行を記載するとエラーとなり、
(2)「テーブルまたはクエリ」からSET文を切り取り、Pre-SQLステートメント欄にSET文を記載すると、エラーは発生しませんが、SJIS指定が効いていないのか読み取り結果が文字化けしてしまいます。
データベース接続時にコードページ設定を行う方法になにかコツはございますでしょうか?
(最終目的は文字化けなくデータ読み出しを完了することです)
※ワークフロー内でコードページ変換する方法につきましては以下記事を見つけております
https://newssdx.kcme.jp/alteryxtips-change_code_page/
解決済! 解決策の投稿を見る。
@Masa23 さん
文字化けの具合から見たところ、
ConvertFromCodePage([col1], 932)
で文字化けを解消できそうですか、一度お試しいただけないでしょうか?
念のための確認ですが、DBに格納しているのは、Shift-JIS(932)で格納しているという前提であっていますでしょうか?
ちなみに、本文のSQL文は1行しか記載できないため、SET文など2行に渡るSQL文はかけません。
また、DBのデータを受け取る時に、文字コードが選べないので、デフォルトの文字コードで帰ってきていると思いますが、
Postgresの場合通常は何もしなければUTF-8となります。そのため、UTF-8であれば何もしなくても文字化けはしないと思いますが、今回Shift-JISとのことなので、Shift-JISからの文字コード変換が必要になる、とのことになります。
ちなみに、私の環境で試したところ、PreSQLなしで上の関数で対応可能でした。PreSQLがうまく動いていないのはちょっと理由はわかりませんが、ドライバ側で弾かれているように思います(ちなみに、私の環境ではそもそもエラーになりました)。結構ドライバでもこのあたりの挙動が変わるのでご注意ください。
使用ドライバ:Simba PostgreSQL 1.5.2.1002.msi
補足ですが、
クライアント側:
OS:Windows10
ODBC Driver:Simba PostgreSQL 1.5.2.1002/psqlodbc_16_00_0000-x64
サーバー側:
OS:Windows10
PostgreSQL ver16
文字コード:UTF-8
の環境では、Alteryx Designer 2023.2/2023.1にて、文字化けなく接続可能です。特にSET client_encoding TO sjis;などは利用しておりません。
ご参考まで。
なにか環境が異なるのであれば、そのあたりの違いもありそうです。ただ、無理やりConvertToCodePageで932指定でDBに書き込んだものは、SET client_encoding TO sjis;ではうまく変換できないようです。
SimbaDriverでは文字化けしてメッセージが読み込めませんが、 本家のODBCでは以下のようなエラーが出ます。
あくまで、UTF-8として保存されている文字列がその範囲を越えた文字列として飛んできているのでおかしい、みたいなエラーでしょうか・・・。
ご返信ありがとうございます。
Postgresqlテーブルへのデータ投入になりますが
実際の環境では、試しにAlteryx Desinerを利用して
Excel File -> ファイル入力ツールl -> セレクトツールで列名変更 -> ファイル出力ツール -> Postgresql
とシンプルな構成でデータ投入しておりました。
頂いたアドバイスから、Postgresqlテーブルのデータ参照時というより、データ投入前にフォーミュラにて「ConvertToCodePage」を行う必要があるのかなと思いましたので、早速試してみたいと思います。
@Masa23 さん
私の方でもシンプルに以下のようなワークフローでデータを保存しています。
バージョンやドライバなどの環境面は同じでしょうか?
ドライバの設定も特にデフォルトから変えておりません。
また、データ投入時のコード変換はあまりうまく行かないのではないかと感じております。サーバーとクライアント間のところでなにかうまくいっていなさそうですね、、、(確かにツールによっては文字化けするとのことなので・・・)。そしてまたそこでバグりそうです・・・。
ちなみに、PostgreSQLはオンプレでしょうか?それともAmazonのRDSなどのものでしょうか?
Kajitani様、返信ありがとうございます。
環境を確認いたしました。
Alteryx Designer Ver: 2023.1.1.123
Postgresql: PostgreSQL 16.1, compiled by Visual C++ build 1937, 64-bit (オンプレ版)
ODBC Driver: PostgreSQL ODBC Driver (ANSI) v13.02.00.00
またありがとうございます。
データ読出し時に「ConvertToCodePage(xxxx,932)」関数を利用して、SQLクライアントからSJISで投入したマルチバイト文字が文字化けなしに表示できることを確認いたしました。
あとは実際の入力データ(ExcelをAlteryx経由でBULKロードしたもの)で試しておりますが
SQLクライアント(client_encoding=sjis設定)では、文字化けせずに読めるものの
Alteryxでデータを読み出し、コードページ変換をかけるも読みだせずにいましたので、このあたりをもう少し模索したいと思います。
↓
追記:
警告メッセージが多数出ていましたので、Alteryx内のデータ型を変更したところ無事にコードページ変換できました。
「ConvError: フォーミュラ (15): <列名>: "<値>" は完全にはWStringからStringに変換できませんでした。」
@Masa23 さん
なるほど、ANSIドライバを使われているのですね。基本的にANSIドライバではなくUnicodeドライバを使うと変換関数使わなくても正常に処理ができるはず、です。
Alteryxの公式のドライバ(License Portalからダウンロードできるドライバ)は、Unicodeベースになっているようです(オプションでUnicodeを使えるかどうか、を選択できるようになっており、デフォルトではチェックが入っています)。