code: func (b *builtinConvertSig) evalString(row chunk.Row) (string, bool, error) {
  	expr, isNull, err := b.args[0].EvalString(b.ctx, row)
  	if isNull || err != nil {
  		return "", true, err
  	}
  
  	// Since charset is already validated and set from getFunction(), there's no
  	// need to get charset from args again.
  	encoding, _ := charset.Lookup(b.tp.Charset)
  	// However, if `b.tp.Charset` is abnormally set to a wrong charset, we still
  	// return with error.
  	if encoding == nil {
  		return "", true, errUnknownCharacterSet.GenWithStackByArgs(b.tp.Charset)
  	}
  
  	target, _, err := transform.String(encoding.NewDecoder(), expr)
  	return target, err != nil, err
  }
docs: // evalString evals CONVERT(expr USING transcoding_name).
  // Syntax CONVERT(expr, type) is parsed as cast expr so not handled here.
  // See https://dev.mysql.com/doc/refman/5.7/en/cast-functions.html#function_convert