アンエスケープ

 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バイト目の次は必ず読み飛ばされてしまう=アンエスケープされない=ようだ。要注意。