Free Trial

ディスカッション

答えを見つけ、質問し、Alteryx の専門知識を共有してください。
解決済み

Postgresql参照時にClient Encodingパラメータを指定する方法について

Masa23
メテオール

お世話になっております。

表題の件につきまして知見お持ちの方、いらっしゃいましたらご教授頂けませんでしょうか。

 

環境

【postgresql】→ODBC→【Alteryx データ入力ツール】

        →ODBC→【SQL MK2クライアントツール】

 

ご相談内容

キャプチャ.PNG

 

キャプチャ2.PNG

 

 

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指定が効いていないのか読み取り結果が文字化けしてしまいます。

 

キャプチャ4.PNGキャプチャ3.PNG

 

 

 

 

 


データベース接続時にコードページ設定を行う方法になにかコツはございますでしょうか? 

(最終目的は文字化けなくデータ読み出しを完了することです)

 

※ワークフロー内でコードページ変換する方法につきましては以下記事を見つけております

 https://newssdx.kcme.jp/alteryxtips-change_code_page/

6件の返信6
AkimasaKajitani
17 - Castor
17 - Castor

@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

 

AkimasaKajitani
17 - Castor
17 - Castor

補足ですが、

クライアント側:

 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では以下のようなエラーが出ます。

 

Clipboard01.png

 

あくまで、UTF-8として保存されている文字列がその範囲を越えた文字列として飛んできているのでおかしい、みたいなエラーでしょうか・・・。

Masa23
メテオール

ご返信ありがとうございます。

 

Postgresqlテーブルへのデータ投入になりますが

実際の環境では、試しにAlteryx Desinerを利用して

 Excel File -> ファイル入力ツールl -> セレクトツールで列名変更 -> ファイル出力ツール -> Postgresql

とシンプルな構成でデータ投入しておりました。

 

頂いたアドバイスから、Postgresqlテーブルのデータ参照時というより、データ投入前にフォーミュラにて「ConvertToCodePage」を行う必要があるのかなと思いましたので、早速試してみたいと思います。

AkimasaKajitani
17 - Castor
17 - Castor

@Masa23 さん

 

私の方でもシンプルに以下のようなワークフローでデータを保存しています。

 

Clipboard01.png

 

バージョンやドライバなどの環境面は同じでしょうか?

ドライバの設定も特にデフォルトから変えておりません。

 

また、データ投入時のコード変換はあまりうまく行かないのではないかと感じております。サーバーとクライアント間のところでなにかうまくいっていなさそうですね、、、(確かにツールによっては文字化けするとのことなので・・・)。そしてまたそこでバグりそうです・・・。

 

ちなみに、PostgreSQLはオンプレでしょうか?それともAmazonのRDSなどのものでしょうか?

Masa23
メテオール

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に変換できませんでした。」

AkimasaKajitani
17 - Castor
17 - Castor

@Masa23 さん

 

なるほど、ANSIドライバを使われているのですね。基本的にANSIドライバではなくUnicodeドライバを使うと変換関数使わなくても正常に処理ができるはず、です。

 

https://knowledge.alteryx.com/index/s/article/Break-Fix---UTF-8-encoding-error-when-connecting-to-Po...

 

Alteryxの公式のドライバ(License Portalからダウンロードできるドライバ)は、Unicodeベースになっているようです(オプションでUnicodeを使えるかどうか、を選択できるようになっており、デフォルトではチェックが入っています)。