質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

1回答

2231閲覧

FreeTDS ODBCドライバ 文字化け

ZhengyuMeng

総合スコア0

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2021/04/25 09:01

編集2021/04/25 13:24

問題点

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接続もエラーでした。

解決に至った経験のある方がいれば、ご教授頂ければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

satokei

2021/04/25 09:23

日本語部分を「[」や「"」で囲ったらどうなるでしょうか? (例)SELECT [担当者名] FROM M_TAN
ZhengyuMeng

2021/04/25 09:38

ご返信ありがとうございました。 試してみたが、症状は変わりませんでした。 SQL> select [担当者名] FROM M_TAN [52003][FreeTDS][SQL Server]SQL Anywhere エラー -143 : カラム '諡?蠖楢??蜷?' が見つかりません。 [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> select "担当者名" FROM M_TAN [37000][FreeTDS][SQL Server]Some character(s) could not be converted into client's character set. Unconverted bytes were changed to question marks ('?') [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 なお、PHPの中、一度mb_convert_encodingにてSQLコードをUTF-8からwindows-31jに変換して実行すれば、正常に動作してくれました。
satokei

2021/04/25 09:44

なるほど。やっぱり文字化けなのですね。
guest

回答1

0

charsetを932JPN、CP932、SJIS-winなどを設定しても解決しなかった。

The freetds.conf file

こちらのドキュメントによると、クライアントの文字コードの設定は、
charsetではなく client charsetのようです。

Localization and TDS 7.0

また文字コード変換は、iconvに依存しているようです。
iconvがインストールされているか、文字コードがサポートされているかを確認してみてください。

投稿2021/04/25 11:07

編集2021/04/25 11:20
satokei

総合スコア1217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ZhengyuMeng

2021/04/25 11:55

ご返信ありがとうございました。 iconv --listで調べたら、windows-31jやSJIS-WINやUTF-8などは含んでありあます。 client charsetをutf-8を設定しましたが、うまく行かないです。 エラーは上記と同様です。 client側のLANGはLANG=ja_JP.UTF-8なので、 UTF-8を設定したが、間違っていますかね。
satokei

2021/04/25 12:42

> UTF-8を設定したが、間違っていますかね。 合っていると思います。 考えてみれば、正常にSELECTできる場合は日本語が表示できているので、 結果の変換はできていて、SQLの変換だけできていないということなのですかね...???? 正直分からないです... CentOS の locale を WINDOWS-31J とかにしたらどうなりますかね?
ZhengyuMeng

2021/04/25 13:18

localeをWINDOWS-31Jでもダメ、、、同じのエラーでした。 更に、SELECT * FROM で抽出したデータも文字化けになりました。 ところで、ほかのドライバーに変わったらどうか試したいが、 何か代用するドライバーがありますか?
satokei

2021/04/25 13:37

ダメでしたか。 すみませんが、代用ドライバーは分からないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問