「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@1008) [中] [未処理]
@1008■ (#3137) 「SQLITE3実行」で正しいデータが取得できない - NAKA (2025-10-01 17:39) /中 未処理
【症状】SQLite3内の日本語文字を含むデータをSELECTで正常に取り出せない
【再現方法】

例えば

SQLITE3自動変換はオン


お客様番号=「AA123456」
部署名=「開発部」
氏名=「鈴木 一郎」
郵便番号=「222-1111」
住所1=「品川区▲■●●3-2-1」

# 会社名=「有限会社鈴木」 # 問題が発生する。
# 会社名=「有限会社オープン」 # 問題が発生する
会社名=「有限会社OpenAI」 # 問題が発生する
#会社名=「TEST」 # 問題が発生する
# 会社名=「」 # 問題が発生する。

# 住所2=「ネコマンション 201」# 問題が発生しない
住所2=「ネコマンション 201 南部屋」# 問題が発生する



SQL_STR = 「INSERT INTO {DB_テーブル名} ({koumoku}) VALUES ("{お客様番号}","{会社名}","{部署名}","{氏名}","{郵便番号}","{住所1}","{住所2}");」
DBHでSQL_STRをSQLITE3実行

をして

DBHで「SELECT * FROM {DB_テーブル名} LIMIT 0, 200;」をSQLITE3実行

DB_CSV=それ
DB_CSVを「test_db.csv」に保存

DBHのSQLITE3閉じる

DB_CSVを言う。

を行うと、吐き出されたCSVファイルには

==ここから
ユーザーID,会社名,所属、役職,氏名,郵便番号1,住所1,住所2
AA123456,有限会社OpenAI,開発部,"鈴木 一郎 enAI",222-1111,品川区▲■●●3-2-1,"ネコマンション 201 南部屋 "
==ここまで

と名前の部分が「鈴木 一郎 enAI」となっていたり、Shift_JISの文字コードにないものが混ざってしまう。
また、

会社名=「TEST」

に変更して実行した場合は、生成されるCSVは空っぽになり何も結果が得られない状況になります。

尚、INSERTやUPDATE等でデータベースを操作する部分では問題が確認できませんでした。
また、DB Browser for SQLite で生成されたDBは正しい値のものが入っていて
最後に、SELECTでなでしこ経由で取り出そうとしたものが正常に取り出せない問題です。


【要望】SQLITE3実行での結果を正しいものにしてほしい

本来であればテストコードで、正しいCSVデータが取得できるはず。

【バージョン】1.588及び、1.591

【その他】

尚、本件事象の回避策としては、SQLite3の32bit ODBC Driverをインストールして
なでしこからODBC経由で「ADO開く」を使い作れば、文字化け系の問題は発生しないことが確認できました。

よろしくお願いします。

以下、上記再現に使ったテストに使ったコード
====
# SQLite3 初期設定

SQLITE3自動変換はオン

DBとは文字列
SQL_STRとは文字列
SQL結果は配列

# koumoku = 「db00,db01,db02,db03,db04,db05,db06」
koumoku = 「ユーザーID,会社名,所属、役職,氏名,郵便番号1,住所1,住所2」

DB_テーブル名 = 「cus_csv_tbl_00」
#SQL_テーブル作成 = 「CREATE TABLE  {DB_テーブル名}(ユーザーID,会社名,所属、役職,氏名,郵便番号1,住所1,住所2);」
SQL_テーブル作成 = 「CREATE TABLE  {DB_テーブル名}({koumoku});」
SQL_テーブル削除 = 「DROP TABLE  {DB_テーブル名};」


DB = 「test.db」
DBH = DBをSQLITE3開く

DBHで「SELECT COUNT(*) FROM sqlite_master WHERE TYPE='table' AND name='{DB_テーブル名}';」をSQLITE3実行
SQL結果はそれ

「テーブル有り:{SQL結果[1]}」を言う。

# SQL結果[0] には、「COUNT(*)」、SQL結果[1] には 0 か 1 が得られる。
もし、(SQL結果[1]=0)ならば
  # テーブル作成
  DBHでSQL_テーブル作成をSQLITE3実行

# とにかく毎回作り直す
DBHでSQL_テーブル削除をSQLITE3実行 # DROP
DBHでSQL_テーブル作成をSQLITE3実行 # CREATE


お客様番号=「AA123456」
部署名=「開発部」
氏名=「鈴木 一郎」
郵便番号=「222-1111」
住所1=「品川区▲■●●3-2-1」

# 会社名=「有限会社鈴木」 # 問題が発生する。
# 会社名=「有限会社オープン」 # 問題が発生する
会社名=「有限会社OpenAI」 # 問題が発生する
#会社名=「TEST」 # 問題が発生する
# 会社名=「」 # 問題が発生する。

# 住所2=「ネコマンション 201」# 問題が発生しない
住所2=「ネコマンション 201 南部屋」# 問題が発生する

SQL_STR = 「INSERT INTO {DB_テーブル名} ({koumoku}) VALUES ("{お客様番号}","{会社名}","{部署名}","{氏名}","{郵便番号}","{住所1}","{住所2}");」
DBHでSQL_STRをSQLITE3実行

# 上記までの結果は、DB Browser for SQLite で確認して意図した結果が保存されていることが確認できる
# しかし、下記のSELECTで取得したCSVはDB内容とは異なる結果となる問題が発生する
# 出力されたcsvが空だったり、文字化けしたり、想定しない文字コードが含まれたものになる。
# 秀丸エディタでcsvを開こうとすると、「NULL文字を空白に変換して読み込みました。」と警告がでる。
# この短いコードの時は、むしろ正しいcsvを取得可能なデータパターンが全く見つけられない結果になった。

# SQLITE3自動変換はオフ # この場合、UTF-8のCSVが出力されるだけで、Shift_JISの結果と同じく正しくない結果が得られる

DBHで「SELECT * FROM {DB_テーブル名} LIMIT 0, 200;」をSQLITE3実行 # ほとんど結果は正しいものが得られない?

# DBHで「SELECT 住所2 FROM {DB_テーブル名};」をSQLITE3実行 # 住所2=「ネコマンション 201 南部屋」の時、「南部屋」の後ろにゴミが入る

DB_CSV=それ
DB_CSVを「test_db.csv」に保存

DBHのSQLITE3閉じる

DB_CSVを言う。

終わり

(#3137)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能