PythonでJDBC使ってSQL ServerクエリしていたらUnicodeEncodeErrorにぶち当たった

時々見るエラーですが、大きなテーブルを読み込むETL処理で出た時などは、だいぶ辛い気分になります。

UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-1: surrogates not allowed

SQLで該当を探す

SparkやBeamを使って大規模データを処理をしている時には、目の前にエラーがあって当たりもついているのに実際のデータを簡単に見る術が無いというのは辛いです。

カラム数や行数が小さいテーブルなら、普通にダンプしたり、デバッグしながら探すのもありだと思います。ログなんて出そうものなら凄いことになりますし。

今回は愚直ですが以下のように対象を絞る手段にしました。

以下で言うと TOP(300) TOP(200000) DESC or ASC を調整しながら対象を絞る感じです。

SELECT TOP(300) * FROM (
SELECT TOP(20000) * FROM [dbo].[TableA]
ORDER BY [primary_key] DESC
) 

今回はこんな風に記号が入っていました。既に稼働しているDBからデータをETLしてくると必ず何かありますね・・他にも西暦1年のデータが来てエラー起こるとかあるあるです。

f:id:yomon8:20200111023633p:plain

Python側対応

参考URLを見て、データ抜き出し処理のところに以下の対応を入れました。

my_val.encode('utf-16', 'surrogatepass').decode('utf-16')

f:id:yomon8:20200111024631p:plain

参考URL

stackoverflow.com