FireDAC/SQLite で日本語テーブル名に対応するには?

解決


lactone  2020-02-16 16:21:14  No: 148563

環境:Windows 10 Home、Delphi 10.3.2 Communutiy eddition、sqlite3.dll ver 3.31.1

フォームに
FDConnection1
FDPhysSQLiteDriverLink1
FDGUIxWaitCursor1
Datasource1
FDQuery1
DBGrid1
を配置、接続し、オブジェクトインスペクタから
FDConnection1.Params に 
 DriverID=SQLite
  Database=path+databasename
  StringFormat= Unicode
を、
  FDQuery1.SQLに
 select * FROM Tablename
を設定し、
FDConnection1.connectedをtrueに,
FDQuery1.activeをtrueにしますと、
DBGrid1にtablenameの内容が表示されます(通常)

しかしtablenameに日本語(全角文字)が使われていると以下のメッセージが出てエラーになる模様です。
(但し、他の原因かもわかりません。)

[FireDAC][Phys][SQLite] ERROR:no such table:tablename.

テーブル名を変更する以外の対処法があれば教えて下さい。


igy  2020-02-16 16:40:27  No: 148564

Delphi 10.3.3 Professinalですが、

CREATE TABLE てすと
(
    TEST  VARCHAR(16)
);

で、テーブルを作成し、

INSERT INTO てすと (TEST) VALUES ('one');
INSERT INTO てすと (TEST) VALUES ('two');
INSERT INTO てすと (TEST) VALUES ('three');

でデータ追加、

SELECT * FROM てすと;

で試しても、普通に表示できますね。


igy  2020-02-16 16:55:54  No: 148565

ちなみに、Delphi 10.3.3 では FireDAC も更新され、SQLiteドライバは 3.23.1から3.28になってますね。


lactone  2020-02-16 17:16:27  No: 148566

対象のdatabaseは旧SQLiteドライバでつくったもので、当該テーブルも管理ツールTkSQLiteでは表示されています。
SQLiteドライバのバージョン違いが原因かもです。
igy様ご指摘のように、新規にテーブルを作ってテストしてみます。


lactone  2020-02-17 08:59:58  No: 148567

新規にテーブルを作ってテストしてみましたが、状況は変わりません。
テーブル名、フィールド名に日本語を含まないテーブルでは機能しますので、
文字コードの問題か?
もう手に負えませんので、give upします。


take  2020-02-17 09:59:39  No: 148568

簡単なテストプログラムを作って本当にテーブル名が漢字なのが原因なのか調べる方が解決出来るかと思います。

データベース操作をプログラム以外のツールからもできる場合は
ツールから作った漢字のテーブル名をプログラムから見ることが出来るか?
プログラムで作ったテーブル名は、ツールからはどう表示されるか?
でわかりやすくなりそうです。

no such tableエラーは、テーブルが見つからない以外にも表示されるので
テーブルが見つからない以外の原因かもしれません。


lactone  2020-02-17 21:47:27  No: 148570

take様、有用なsuggestionを有難うございます。
テーブルはコマンドプロンプトから、また管理ツールからも確認できますので、
no such tableエラーが出るのは、
FireDACが日本語のテーブル名、カラム名に対応していないから、
と推量します。
テーブル名、カラム名は英数文字でという太古の教えは現代でもいきているのですね。

解決とは言えませんが、手続き上解決としておきます。


HFUKUSHI  2020-02-18 10:07:23  No: 148571

SQLiteも詳しくないし試してもいないのですが、ASCII範囲外の文字を含むテーブル名やカラム名を
シングルクォート(')、ダブルクォート(")、バッククォート(`)のいずれかで括ったらどうでしょう?
既に試していたらすいません。


lactone  2020-02-18 12:06:32  No: 148572

HFUKUSHI 様、有用なsuggestionを有難うございます。
テーブル名が日本語、カラム名が英数文字では進展ありませんでした。
次に
テーブル名が英数文字、カラム名が日本語のcaseをテストしてみました。
CREATE TABLE TEST2 ("てすと"  VARCHAR(16) );
INSERT INTO  TEST2 ("てすと") VALUES ('one');
INSERT INTO  TEST2 ("てすと") VALUES ('two');
INSERT INTO  TEST2 ("てすと") VALUES ('three');

で作った、テーブル名が英数文字、カラム名が日本語のテーブルでテストしました。
FDQuery1.SQLに select * FROM TEST2 をセットしてFDQuery1.activeをtrueにしますと
やはり、no such tableエラーが出るのですが、もう一度FDQuery1.activeをtrueにしますと、
今度は通してくれます。
DBGridにはカラム名は(おそらくdefaultの)「 無名0 」となっています。
データのone,two,threeは表示されていませんが、レコード数は3となっています。
カラム名も日本語はダメですよ、と言ってるようです。

プロのDBエンジニアの方々は今もテーブル名、カラム名は英数文字派なのですか?


take  2020-02-18 15:06:38  No: 148573

プロじゃ無いけど、テーブルの一覧でクエリまで表示されるデータベースだったら頭3文字 tbl とか sqlとか付けるかも
名称に漢字が使えるデータベースで楽だと思って漢字を使ってもそんなに便利じゃ無い
でも漢字を使わなかったら思いつきで変な和製英語が爆誕するからどっちもどっち

プログラム上だとテーブル名は定数で定義するからどっちでも変わらない


HFUKUSHI  2020-02-18 15:39:51  No: 148574

まさにこういうことがあるのでデータベースのいろいろなものの名前はASCII範囲に収めてます。DBのプロではありませんが。
(使うRDBすべてに精通していれば問題ないのかもしれませんが…


lactone  2020-02-18 15:42:11  No: 148575

take様、なるほど!な情報を有難うございました。


lactone  2020-02-18 15:45:37  No: 148576

HFUKUSHI様、貴重なご意見を有難うございました。


igy  2020-02-18 19:15:13  No: 148577

カラム名も漢字で、試してみました。

CREATE TABLE "都道府県"
(
     "番号"        INTEGER NOT NULL PRIMARY KEY
    ,"都道府県名"  VARCHAR(16)
);

で、テーブルを作成し、

INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (40, '福岡県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (41, '佐賀県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (42, '長崎県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (43, '熊本県');

でデータ追加、

SELECT
  "番号"
 ,"都道府県名"
FROM
 "都道府県"
WHERE
  "番号" > 40;

をDBGridに表示。

Delphi 10.3.3 + FireDAC (SQLiteドライバ 3.28)
Delphi 10.3.3 + dbExpress + SQLite3.dll Ver.3.31.1
Delphi XE + UniDAC 8.1.2 + SQLite3.dll Ver.3.31.1
Delphi XE + ZeosLib 7.2.6 + SQLite3.dll Ver.3.31.1

のいずれも、DBGridのタイトル行にカラム名(番号・都道府県名)も表示され、
データも正しく表示できました。


lactone  2020-02-18 21:11:48  No: 148578

igy様、私のprimitiveな質問のために、
貴重な時間を割いて多くの接続テストをして頂いて有難うございます。

FDQuery1.open('select sqlite_version() as ver ');
showmessage(FDQuery1.FieldByName('ver').asstring);
で確認しました当方のFireDACのSQLiteドライバも3.28.0でした。

では、なぜ??????????????

再確認のため

CREATE TABLE "都道府県"
(
     "番号"        INTEGER NOT NULL PRIMARY KEY
    ,"都道府県名"  VARCHAR(16)
);

で、テーブルを作成し、

INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (40, '福岡県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (41, '佐賀県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (42, '長崎県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (43, '熊本県');

でデータ追加し、
(管理ツールtksqliteで確認後)
FDQuery1.SQLに

SELECT
  "番号"
 ,"都道府県名"
FROM
 "都道府県"
WHERE
  "番号" > 40;

をセットしてDBGridに表示を試みましたが、
やはり、
[FireDAC][Phys][SQLite] ERROR:no such table:都道府県.
がでます。

ウ~ン、不可解・・・・・

何か、もっと基本的なところで、ミスや思い違いを犯しているのかも知れません。


igy  2020-02-18 21:42:31  No: 148579

もし、試せるなら、以下の方法で、テーブル一覧を取得してみてください。

ListBoxを追加して、

FDConnection1.GetTableNames('', '', '', ListBox1.Items, [osMy], [tkTable], False);

で、取得できると思います。

私のほうでは、テストしたテーブルは、
"都道府県"
と表示されています。


lactone  2020-02-18 21:50:05  No: 148580

FDConnection1.GetTableNames('', '', '', ListBox1.Items, [osMy], [tkTable], False);
を実行しました結果、
"都道府県"
は文字化けしています。
取り急ぎご報告いたします。


igy  2020-02-18 21:57:14  No: 148581

SQLite,文字コードを設定(変更)・確認する
https://iwakurabit.com/training-sqlite3-check-or-set-character-code/
に記述されている
pragma encoding
で、私が試したデータベースファイルの文字コードは、
UTF-8
だったのですが、lactone さんがお使いのデータベースファイルの文字コードも、
UTF-8
となりますか?


lactone  2020-02-18 22:03:15  No: 148582

pragma encoding

UTF-8
であることを確認しました。


igy  2020-02-18 22:07:36  No: 148583

ちなみに、テーブルの作成とデータの追加は、
> 管理ツールtksqlite
で行いましたか?


lactone  2020-02-18 22:08:56  No: 148584

テーブルの作成とデータの追加はコマンドラインで行いました。


igy  2020-02-18 22:12:32  No: 148585

> テーブルの作成とデータの追加はコマンドラインで行いました。

もしかしたら、コマンドラインだと、Windowsの場合、UTF-8じゃなく、Shift-JISになるとか・・


igy  2020-02-18 22:16:05  No: 148586

コード上で、デーブル作成・データ追加した場合、どうなりますか?

    // テーブル生成
    try
        with DModuleDB.FDQuery1 do
        begin
            Close;
            SQL.Clear;
            SQL.Add('CREATE TABLE  "都道府県"');
            SQL.Add('(');
            SQL.Add('    "番号"        INTEGER NOT NULL PRIMARY KEY');
            SQL.Add('   ,"都道府県名"  VARCHAR(16) ');
            SQL.Add(');');
            ExecSQL;
        end;
    except
        on E: Exception do
            MessageDlg('SQLエラー:' + E.Message, mtError, [mbOk], 0);
    end;

    // データ追加
    try
        with DModuleDB.FDQuery1 do
        begin
            Close;
            SQL.Clear;
            SQL.Add('INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (41, '''佐賀県'''); ');
            ExecSQL;
        end;
    except
        on E: Exception do
            MessageDlg('SQLエラー:' + E.Message, mtError, [mbOk], 0);
    end;


lactone  2020-02-18 22:16:13  No: 148587

なるほど!です。
SQLでの追加を試みて見ます。
結果は追ってご報告いたします。
igy様には無限の感謝の意を表します。


lactone  2020-02-18 23:04:59  No: 148588

成功しました!!!!
ご教示の通りで、エラー回避できました。

>もしかしたら、コマンドラインだと、Windowsの場合、UTF-8じゃなく、Shift-JISになるとか・・

原因がわかり、過去3日間のモヤモヤが晴れました。
本当に、ありがとうございました。

テスト接続は成功しましたので、
あとは、既存のshft-jisのデータベースをutf-8に変換できるか、という問題になりますが、
これは別のスレッドを立てるのが適切と思います。

繰り返します。
igy様、ありがとうございました、


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加