C APIを用いて、MYSQLにテキストファイルの中身を格納したいと考えています。
以下のプログラムのように一度ファイルの中身をchar型配列に書き出し、配列の中身をクエリにコピーというようにすると、ファイルの大きさに合わせて、非常に大きな配列を確保しなければならないと思います。
int main(void){
MYSQL mysql;
char query[1000];
char buf[1000];
FILE *fp;
fp = fopen("test.txt", "r");
mysql_init(&mysql);
if(!mysql_real_connect(&mysql,ホスト名,ユーザ名,パスワード,DB名,0,NULL,0)){
//エラー処理
}
fread(buf, sizeof(char), sizeof(buf), fp );
sprintf(query, "insert into DB名 values(buf));
mysql_real_query(&mysql, query, strlen(query));
}
これではメモリの無駄遣いなので、他の方法として、
1.データを分割して複数回に分けて挿入する
2.テキストファイルから直接読み込む
を考えました。
しかし
1.は方法が分からず、
2.はリダイレクトを使えばできると思ったのですが、リダイレクトでは
テキストファイルにSQLコマンドも記入しておく必要があると思うの で、今回の方法には合いません。
MYSQLのフィールドにC言語から大きいデータを書き込むよい方法があれば教えてください。さらには、読み出し方まで教えていただけると助かります。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
主目的は、「C APIを使用すること」でしょうか?それとも、「MySQLにテキストデータを格納すること」でしょうか?
後者であれば、アプリケーションのメモリに溜め込まなくても、格納はinsert文でload_file関数を使用、検索はselect文でinto outfileで吐き出すことが可能です。
ちなみに、SQL99で「ロケータ」というデータそのものでなく、ポインタで操作する機能が規定されており、それがMySQLでも実装されれば今回のような操作も軽くなるのですけどね。
教えていただいたload_file関数、into outfileを用いて書き込み、読み出しできました!ありがとうございました!!
ファイルサイズが大きすぎるというエラーが出ましたが、max_allowed_packet変数を書き換えることで対応できました。
ただ調べてみたところ、ファイルだけでなくディレクトリにも誰でも読み書きできる権限を与える必要がある、サーバ-クライアント形式のシステムにした場合にファイルを一度サーバ側にコピーしなくてはならないなど、あまり使い勝手がよい関数とは言えないようですね。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL MySQLのテーブル作成でハイフン - は使用できないのでしょうか? 2 2022/10/21 16:50
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- MySQL 参考書に従って入力したつもりでしたが、最後はエラーがでました。 1 2022/09/28 03:45
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- フリーソフト 色々な形式の個人情報を後で参照しやすいようWindow10で管理したいのですが、どんな方法があるの? 1 2023/04/29 16:46
- MySQL mysqlがインストールされているのかわかりません 1 2023/06/05 02:26
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cseデータ閲覧時に文字化け
-
シングルクォーテーションとダ...
-
MySQLでのデータ保存場所の変更
-
接続ができません
-
VBAで変数内に保持された二次配...
-
SQLのVARCHARとVARCHAR2の違い
-
ERROR 1045 (28000) (using pas...
-
like句を使って日本語を検索す...
-
SQL開発環境ソフトウェアである...
-
MySQLのテーブル作成でハイフン...
-
MySQLカラム名は日本語と英数字...
-
ユーザの権限及びユーザの削除...
-
postgreSQLのデータ型
-
ODP.NETのバージョン確認
-
実行時エラー80004005
-
MYSQLで、ファイルを格納する方...
-
for($i=1; $i<hoge; $i++)
-
設定が更新されない
-
FORMからPHP処理
-
副問合せにLIKE文を使う方法は...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mysqlへのインポート処理がうま...
-
cseデータ閲覧時に文字化け
-
mysqlコマンドでSQL文が実行で...
-
シングルクォーテーションとダ...
-
Usage: \\.<filename> | sourc...
-
mysqlのmatch() against()で検...
-
SELECTした値との比較
-
MAX()でENUMの内部番号が最大の...
-
MySQLでのデータ保存場所の変更
-
MySQLのLOAD DATA INFILEコマン...
-
MySQLのデータの互換性は?
-
ERROR 1054 (42S22) 原因不明です
-
MYSQLへのデータサイズの大きな...
-
Mysql char
-
postgre ⇒ mysql にした場合...
-
列名を式で指定することはでき...
-
MySQLリファレンスマニュアル(...
-
PHPの質問です、ご回答いただけ...
-
mysql超初心者です。テーブルへ...
-
"文字列"? > CSVデータをMySQL...
おすすめ情報