PHPから、mysql_query($qsl,$conn)で、
$sql = ”Insert into test_tbl(col1,col2) values (1,’てすと’)”;
というような日本語を含んだInsertを流すと日本語文字列が落ちて登録されます。
インサート失敗などならまだ理解できるのですが、col1に1と入ったレコードはできています。
これは仕様ですか?また、回避する(日本語文字列を登録する)やり方について教えてください。
詳細環境はLinux - Apache/2.0.52 (Unix) PHP/5.0.3 - mysql5.0.2 alpha版です。
回避するには、’’の中身を外出ししましょう。
$tst = ”てすと”;
$sql = ”Insert into test_tbl(col1,col2) values (1,’”.$tst.”’)”;
と記述すればうまくいきます。
困りました。できません。ちなみに半角文字列なら普通にインサートできます。
日本MySQLユーザ会のMLで同じような話題が最近出ていました。
参考URLの1つ目のこのスレッドは役に立ちませんか?
参考URLの2つ目は、やはり日本MySQLユーザ会のFAQです。4.1以降では国際化処理などがそれ以前と変わっているので注意ということが書かれています。
MySQL5.0は冒険しすぎでしたか…
外していたらすみませんが、PHPのコンパイル時にマルチバイト文字対応のオプションは設定されていますか?
--enable-mbstring
--enable-mbregex
あとひょっとすると
-enable-zend-multibyte
’--enable-mbstring’ は指定しています。
--enable-mbregex
-enable-zend-multibyte
は指定していません。mySQLを入れ替えるまでダメという段になったらこの辺もトライしてみます。
5.0系列は使ったことがないので見聞きした範囲で。まず、テーブルのカラム型とその長さは文字列に適したもの(型や長さ)になっているでしょうか? 参考URLにはUTF8の場合CHARではなくVARCHARを使えと書いてあるのでそのあたりを確認してみてはどうでしょうか。また、もしサンプルのSQLを実際には間に変数をいれているようだったらinsert文を発行する前にprintf()などしてチェックしてみるのもいいかもしれません(すでにやっているとは思いますが念のため)。
私も始めてMySQLを使うのでよくわかっていませんが、さすがにそこら辺は大丈夫です。
ちなみに、TelnetでMySQLコマンドを打ってみたのですが日本語が打てませんでした。
やはり根本的問題ですかね。PHP連携以前の問題のようです。
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col1 | int(5) | YES | | NULL | |
| col2 | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
はい。さすがにPHPの文字化けとは異なるようです。さて…、mysqlを4に落としますか…。
文字列を明示するにはどうしたらいいのでしょうか。”’’文字列?’’”???
$iCol1 = $_POST[’col1’];
$sCol2 = $_POST[’col2’];
$iCol1 = 555;
$sCol2 = ”てすと”;
//print ($iCol1.$sCol2);
$sql = ”Insert into test_tbl(col1,col2) values (’$iCol1’,’$sCol2’)”;
ちなみに変数に突っ込んでみても、登録されませんでした。