MySQLでクライアントから送られてくるデータ列に含まれている エスケープ文字 を元に戻すロジックを調べてみた。blobへの挿入時に、一部文字がアンエスケープされないまま入ってしまう=データが変わってしまう=という現象に遭遇したため。
MySQL のソースでは、sql/sql_lex.cpp にてこの処理を行っている
static char *get_text(LEX *lex) : while (lex->ptr != lex->end_of_query){ #ifdef USE_MB if (use_mb(default_charset_info) && (l = my_ismbchar(cs, (const char *)lex->ptr-1, (const char *)lex->end_of_query))) { lex->ptr += l-1; continue; } #endif if (c == '\\'){ :
(引用は 4.0.18。 4.1.1では default_charset_info のところが cs)
sjis でサーバ運用をしていると、sjisの1バイト目の次は必ず読み飛ばされてしまう=アンエスケープされない=ようだ。要注意。