- 締切済み
MYSQLのデータに「;」を入力
mysql4.0.20を使用しています、データの中にセミコロンを入れたいのですが、セミコロンをSQL文の終了と判断?されるため、うまくいきません。 たとえば以下のようなSQLにて replace into tableA set columA='data1;data2', columB='data'; data1とdata2の間のセミコロンでおこられるのですが、どなたか、mysqlにて データとしてセミコロンを入力する方法を教えていただけないでしょうか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- ham_kamo
- ベストアンサー率55% (659/1197)
ham_kamoです。 以下のソースで試したところ、エラーになりませんでした。 <?php $con = mysql_connect("localhost","user1",""); mysql_select_db("test"); $hoge = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"; mysql_query(sprintf("replace into tableA set hoge='%s';",$hoge)); mysql_close($con); ?> 実行結果 mysql> select * from tableA; +-----------------------------------------------------------------------+ | hoge | +-----------------------------------------------------------------------+ | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) | +-----------------------------------------------------------------------+ 1 row in set (0.00 sec) $hoge = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)"; を $hoge = getenv('HTTP_USER_AGENT'); に変えても同じくエラーにはならずにレコードが挿入されました。 すみません、こちらの環境で再現しないので私もちょっとお手上げです。 バージョンの違いによるものなのかな…。 お力になれずすみません。他に詳しい方がフォローしてくれるといいのですが。
- ham_kamo
- ベストアンサー率55% (659/1197)
$hoge = "testdata1; testdata2; testdata3"; mysql_query(sprintf("replace into tableA set hoge='%s';",$hoge)); 特におかしくはないですね…。 試しに自分の環境で同じ名前のテーブルを作ってPHPから上のコードを実行したら、エラーにならずにちゃんとレコードが追加されました。 mysql> select * from tableA; +---------------------------------+ | hoge | +---------------------------------+ | testdata1; testdata2; testdata3 | +---------------------------------+ 1 row in set (0.00 sec) testdata1やtestdata2の部分の文字列には、実際には'(シングルクオート)が含まれていたりしませんか?
- ham_kamo
- ベストアンサー率55% (659/1197)
No.1です。補足拝見しました。 > ・phpスクリプトにてSQL文作成replace文実行 そのSQL作成のコードを記載していただければ、具体的に何かわかるかもしれないので、補足願えないでしょうか。 No.2の方への補足にある、 > Check the manual that corresponds to your MySQL server version for the right syntax to use near 'data2'' at line 1 において、data2の後ろにシングルクオートが2つついているのが気になります。やはりクオートがらみのような気がするのですが。
補足
ham_kamoさんありがとうございます。 >そのSQL作成のコードを記載していただければ、具体的に何かわかるかもしれないので、補足願えないでしょうか。 $hoge = "testdata1; testdata2; testdata3"; mysql_query(sprintf("replace into tableA set hoge='%s';",$hoge)); こんな感じです。
- Xaval
- ベストアンサー率58% (61/105)
参考までに。。 phpMyAdminは日本語対応です。
- chukenkenkou
- ベストアンサー率43% (833/1926)
MySQL 5.0のcommand line clientでは、問題なく実行できました。 >data1とdata2の間のセミコロンでおこられる 具体的に、どんなエラーになるのですか?
お礼
chukenkenkouさん、回答ありがとうございました。 コマンドラインで実行したところ、実行できました。 phpスクリプトを組んで、cronで自動実行していたのですが、データが書き込まれていないため、「かねやんMysqlAdmin」というソフトでSQLを実行すると以下のようなエラーが出てしまい、「;」の為と思いこんでいました。 phpからの実行、「かねやんMysqlAdmin」の両方で実行できないが、MYSQLコマンドラインから実行可能ということは何が原因なんでしょうか? 「Check the manual that corresponds to your MySQL server version for the right syntax to use near 'data2'' at line 1」 お教えいただけないでしょうか。
- ham_kamo
- ベストアンサー率55% (659/1197)
おかしいですね。MySQLでは別に文字列の中でセミコロンをエスケープしたりする必要はないはずですが。MySQLのコマンドラインから試しても同じような結果になるでしょうか? PHPやPerlなどからSQL文字列を作り出して実行しようとしているのであれば、その時点で先の'(シングルクオート)がPHPやPerlに食われてしまっていて、結果的にセミコロンのところでエラーになっているのではないでしょうか。(それだと別のエラーになりそうな気もしますが…)
お礼
ham_kamoさん、回答ありがとうございます。 さきほど、MYSQLのコマンドラインから直接実行すると、replace文が実行できました。今回エラーが出ているのは、PHPからSQL文を作成して実行していたのですが。 ・phpスクリプトにてSQL文作成replace文実行 エラーがでてreplaceできません。 ・「かねやんSQLAdmin」等のSQLAdminソフトにて実行 エラーがでてreplaceできません。 ・MYSQLコマンドラインにて実行 エラーもでず、replace可能でした。 ということはham_kamoさんのおっしゃるとおり、PHPにてつくり出したSQL分のためエラーがでているのでしょうか? 「かねやんSQLAdmin」で実行してもエラーが出るためどうすればいいのか。。。すいませんが、お教えいただけないでしょうか。
補足
ham_kamoさんありがとうございます。 実際のtestdata1やtestdata2の部分は Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322) な感じのデータです。USERAGENTをデータベースに突っ込もうとすると USERAGENTの;の部分でエラーが出てreplaceできませんでした。