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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

1277閲覧

C言語からMySQLにバイナリ情報をINSERTしたい

TarouMos

総合スコア21

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2019/07/17 07:49

C言語からMySQLにアクセスしてバイナリ情報を INSERT としたいと思っています。
あるシステムが物理ファイル型DBを持っていましてMySQL化したいのです。
物理ファイル型DBは、
先頭にレコード件数(dataNum)
それ以降、データ名(dataName)、データ(data)、データ名、データ、データ名、データ....

データ名(char dataName[255])
データ(unsigned char data[1024])
という構造になっています。

テーブルの定義は

table

1id int(11) AUTO_INCREMENT 2dataName varchar(255) 3data varchar(1024) 4createDate datetime CURRENT_TIMESTAMP

ファイルを開き データ名、データを抽出することできています。
これを

C

1for (int i=0; i < dataNum; i++) { 2 printf(" id: %d = %s\n", i, dataName[i]); 3 snprintf( &sql_str[0] , sizeof(sql_str)-1 , " INSERT INTO testTable (dataName, data) VALUES ('%s', '%s')", dataName[i], data[i]); 4 if( mysql_query( conn , &sql_str[0] ) ){ 5 // error 6 printf("Error: %s\n ", mysql_error(conn)); 7 mysql_close(conn); 8 exit(-1); 9 } 10}

ビルドして実行すると

id: 0 = testName01 Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''�Rp�&QM?�>�b���*���M4��Om����8k{> ��>���<F}�?;' at line 1

とエラーになってしまいます。
根本的な考え方が間違っているのでしょうか?

よろしくお願い致します。

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

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

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

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

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

showkit

2019/07/17 07:53

バイナリデータは 通常 blob 型を使用しますが、そのことはご存知ですか?
TarouMos

2019/07/17 08:14

blob型というのは知りませんでした。 この辺りを調べてみます。 ありがとうございます。
guest

回答1

0

ベストアンサー

**data varchar(1024)**と文字型で宣言していますから、文字コードの範囲外であるデータでエラーになっているのではないでしょうか。

BLOB型、BINARY型、VARBINARY型などで定義すると良いのではないかと。

投稿2019/07/17 08:05

sazi

総合スコア25186

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

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

TarouMos

2019/07/17 08:49

アドバイス。 ありがとうございます。 仮に、BLOB型にした場合、 INSERT文は、どの様に書くのが良いのでしょう? フォーマット指定子が %s のままでは同じエラに成ってしまいます。 " INSERT INTO testTable (dataName, data) VALUES ('%s', '%s')", dataName[i], data[i] ご存知でしたら教えていただけると助かりま。
sazi

2019/07/17 09:14

ファイルにアクセスしてそれをinsertするんだったらストリームで扱うのが一般的(?)なのかもしれません。
TarouMos

2019/07/23 11:03

ありがとうございます。 アドバイスを元にinsertすることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問