問題点
centos8にFreeTDS ODBCドライバを経由してSQLAnywhereデータベースサーバーに接続。
コマンドラインでマルチバイト(日本語)のSQLを送信するとエラーが発生。
サーバー上にテープルのカラム名は日本語なので、カラム指定、WHEREなどはすべてエラーでした。
発生している問題・エラーメッセージ
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL> SELECT 担当者名 FROM M_TAN
[42W04][FreeTDS][SQL Server]SQL Anywhere エラー -131 : '?' 行 1 の近くに構文エラーがあります。
[37000][FreeTDS][SQL Server]Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks ('?')
[ISQL]ERROR: Could not SQLPrepare
SQL>
環境
ローカル:CentOS Linux release 8.3.2011
LANG=ja_JP.UTF-8
サーバー:Windows 2008R2 Build 7601 Service Pack 1
データベース:SqlAnywhere 16.0.0.1324
CHAR文字コード:Windows-31J
NCHAR文字コード:UTF-8
FreeTDS.confの設定など
A typical Sybase server
[egServer50]
host = host
port = port
tds version = 5.0
client charset = UTF-8
charset = SJIS-win
tsql -H host -p prot -U UID -P Password
locale is "ja_JP.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
SQLに日本語なしならOK
「SELECT * FROM XXX」すべて英語なら正常に実行し、カラム名(日本語)の表示も文字化けしない。
SQL> SELECT * FROM W_HATUF_CSV
+------------+----------------+-------------------------+-------------------------------+---------------------------+
| SEQ | 商社コード| EDIデータ有無区分| メールデータ有無区分| 登録日 |
+------------+----------------+-------------------------+-------------------------------+---------------------------+
| 721 | 11 | 2 | 0 | 2021-03-02 00:00:00.000000|
| 722 | 14 | 2 | 0 | 2021-03-02 00:00:00.000000|
| 723 | 17 | 2
推測
ODBCドライバの文字コードの設定がうまくできていないでは?
charsetを932JPN、CP932、SJIS-winなどを設定しても解決しなかった。
最終的にはApache + PHP(Laravel)の運用ですが、PHPでのPDO接続もエラーでした。
解決に至った経験のある方がいれば、ご教授頂ければ幸いです。