※ ChatGPTを利用し、要約された質問です(原文:制御文字を含む文字列を扱うには)
制御文字を含む文字列を扱う方法とは?
このQ&Aのポイント
MySQLで制御文字を含む文字列を扱う方法について調査しました。
特定のフィールドには0~255の全ての文字コードを文字列データとして入力し、インデックス化や検索を行うことができます。
ただし、制御文字や特殊文字を含む場合は注意が必要であり、適切なエスケープ処理を行う必要があります。
field char(50) binary not null unique primary key,fulltext (field)
この設定で作られたフィールドがあり、主にlike検索をされます。
このフィールドには本来10進数の数字の文字列を入力する事を考えていたのですが、(数値としては桁数が大きすぎる事と、その数字列の中に"123"を持つ物を探すなど数量とは関係無い検索がされる事から文字列にしています)
MySQLのリファレンスによると、インデックスの対象になる文字列は桁数が短い方がいいようなので、どうせ数値でなく文字列を使っているのならと思い、1バイトで表現出来る全ての文字を使い256進数で表し、桁数を節約しようと考えました。
256進数に直してしまうと10進数の状態で"ある数字列"を持つのかどうか分からなくなるのではないかと思うかもしれませんが、それはこのフィールドに行われるlike検索の特徴により解消されます。
長い前置きでしたが、質問はタイトル通り制御文字を含む文字列を扱う事、言い換えれば0~255の全ての文字コードを文字列データとしてMySQLでインサート・全文インデックス・セレクトする方法です。このフィールドのデータは出力される事は無く、selectのwhere部分に使われ、出力されるのは同レコード内の別のフィールドのデータです。
素直に以下のコードでテストしましたが失敗しました。
while ($i < 50){
$rand = mt_rand(0,255);
$str .= chr($rand);
$i++;
}/*insertする文字列$strを生成*/
$sql = "insert into table(field) values ('$str')"
$strの中に制御文字や"や'等の文字が入るとinsertが失敗し、追加出来たレコードについても、コマンドプロンプトからselectして出力してみるとPCが警告音を連発します。
何か方法は無いでしょうか?
お礼
phpのaddslashesで出来ました。 レスありがとうございました。