code: func (b *builtinCharSig) evalString(row chunk.Row) (string, bool, error) {
  	bigints := make([]int64, 0, len(b.args)-1)
  
  	for i := 0; i < len(b.args)-1; i++ {
  		val, IsNull, err := b.args[i].EvalInt(b.ctx, row)
  		if err != nil {
  			return "", true, err
  		}
  		if IsNull {
  			continue
  		}
  		bigints = append(bigints, val)
  	}
  	// The last argument represents the charset name after "using".
  	// Use default charset utf8 if it is nil.
  	argCharset, IsNull, err := b.args[len(b.args)-1].EvalString(b.ctx, row)
  	if err != nil {
  		return "", true, err
  	}
  
  	result := string(b.convertToBytes(bigints))
  	charsetLabel := strings.ToLower(argCharset)
  	if IsNull || charsetLabel == "ascii" || strings.HasPrefix(charsetLabel, "utf8") {
  		return result, false, nil
  	}
  
  	encoding, charsetName := charset.Lookup(charsetLabel)
  	if encoding == nil {
  		return "", true, errors.Errorf("unknown encoding: %s", argCharset)
  	}
  
  	oldStr := result
  	result, _, err = transform.String(encoding.NewDecoder(), result)
  	if err != nil {
  		logutil.Logger(context.Background()).Warn("change charset of string",
  			zap.String("string", oldStr),
  			zap.String("charset", charsetName),
  			zap.Error(err))
  		return "", true, err
  	}
  	return result, false, nil
  }
docs: // evalString evals CHAR(N,... [USING charset_name]).
  // See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_char.