docs: public String getInternalString(ColumnInformation columnInfo, Calendar cal, TimeZone timeZone)
        throws SQLException {
      if ((lastValueNull & BIT_LAST_FIELD_NULL) != 0) {
        return null;
      }
  
      switch (columnInfo.getColumnType()) {
        case STRING:
          if (getMaxFieldSize() > 0) {
            return new String(buf, pos, Math.min(getMaxFieldSize() * 3, length),
                StandardCharsets.UTF_8)
                .substring(0, Math.min(getMaxFieldSize(), length));
          }
          return new String(buf, pos, length, StandardCharsets.UTF_8);
  
        case BIT:
          return String.valueOf(parseBit());
        case TINYINT:
          return zeroFillingIfNeeded(String.valueOf(getInternalTinyInt(columnInfo)), columnInfo);
        case SMALLINT:
          return zeroFillingIfNeeded(String.valueOf(getInternalSmallInt(columnInfo)), columnInfo);
        case INTEGER:
        case MEDIUMINT:
          return zeroFillingIfNeeded(String.valueOf(getInternalMediumInt(columnInfo)), columnInfo);
        case BIGINT:
          if (!columnInfo.isSigned()) {
            return zeroFillingIfNeeded(String.valueOf(getInternalBigInteger(columnInfo)), columnInfo);
          }
          return zeroFillingIfNeeded(String.valueOf(getInternalLong(columnInfo)), columnInfo);
        case DOUBLE:
          return zeroFillingIfNeeded(String.valueOf(getInternalDouble(columnInfo)), columnInfo);
        case FLOAT:
          return zeroFillingIfNeeded(String.valueOf(getInternalFloat(columnInfo)), columnInfo);
        case TIME:
          return getInternalTimeString(columnInfo);
        case DATE:
          Date date = getInternalDate(columnInfo, cal, timeZone);
          if (date == null) {
            return null;
          }
          return date.toString();
        case YEAR:
          if (options.yearIsDateType) {
            Date dateInter = getInternalDate(columnInfo, cal, timeZone);
            return (dateInter == null) ? null : dateInter.toString();
          }
          return String.valueOf(getInternalSmallInt(columnInfo));
        case TIMESTAMP:
        case DATETIME:
          Timestamp timestamp = getInternalTimestamp(columnInfo, cal, timeZone);
          if (timestamp == null) {
            return null;
          }
          return timestamp.toString();
        case DECIMAL:
        case OLDDECIMAL:
          BigDecimal bigDecimal = getInternalBigDecimal(columnInfo);
          return (bigDecimal == null) ? null : zeroFillingIfNeeded(bigDecimal.toString(), columnInfo);
        case GEOMETRY:
          return new String(buf, pos, length);
        case NULL:
          return null;
        default:
          if (getMaxFieldSize() > 0) {
            return new String(buf, pos, Math.min(getMaxFieldSize() * 3, length),
                StandardCharsets.UTF_8)
                .substring(0, Math.min(getMaxFieldSize(), length));
          }
          return new String(buf, pos, length, StandardCharsets.UTF_8);
      }
    }