programing

MySQL/MariaDB의 ORLite 날짜(밀리초 정밀도)

topblog 2023. 8. 31. 23:32
반응형

MySQL/MariaDB의 ORLite 날짜(밀리초 정밀도)

ORLite 질문입니다.Android 앱과 Java 웹 서비스 모두에서 데이터를 유지하기 위해 사용하는 POJO 세트를 가지고 있습니다(각각 SQLite 및 MariaDB).5.3 이후로 MariaDB는 길이가 있는 타임스탬프/날짜 시간을 지원하여 필드의 정밀도를 마이크로초로 확장합니다(MySQL 자체가 새로운 dev 5.6 릴리스에서 이를 지원합니다).

그러나 명령행에서 수동으로 필드를 수정하여 열을 DATTIME(6)으로 설정하더라도 ORLite에서 내 날짜 필드를 밀리초 단위로 정확하게 유지할 수 없습니다.POJO에서 DATE_LONG 또는 DATE_STRING의 dataType을 사용할 수 있다는 것은 이해하지만, MariaDB에서 실제 DATETIME 유형을 사용하고 싶습니다.

제가 밀리초의 정밀도로 이것을 할 수 있는 방법이 있을까요?

질문 아래에 있는 댓글을 보고 여기서 무슨 일이 일어나고 있는지 이해하십시오.기본적으로 새 데이터베이스가 필요합니다.다음을 입력합니다(MariaDB와 함께 작업하는 경우 MySQL 하나만 하위 클래스로 지정).

public class MariaDBType extends MysqlDatabaseType {

    private final static String DATABASE_URL_PORTION = "mysql";
    private final static String DRIVER_CLASS_NAME = "org.mariadb.jdbc.Driver";
    private final static String DATABASE_NAME = "MariaDB";

    @Override
    public boolean isDatabaseUrlThisType(String url, String dbTypePart) {
        return DATABASE_URL_PORTION.equals(dbTypePart);
    }

    @Override
    protected String getDriverClassName() {
        return DRIVER_CLASS_NAME;
    }

    @Override
    public String getDatabaseName() {
        return DATABASE_NAME;
    }

    @Override
    protected void appendDateType(StringBuilder sb, FieldType fieldType, int fieldWidth) {
        /**
         * TIMESTAMP in MySQL does some funky stuff with the last-modification time. Values are 'not null' by default
         * with an automatic default of CURRENT_TIMESTAMP. Strange design decision.
         */
        if (isDatetimeFieldWidthSupported()) {
            sb.append("DATETIME(").append(fieldWidth).append(")");
        } else {
            sb.append("DATETIME");
        }
    }

    public boolean isDatetimeFieldWidthSupported() {
        return true;
    }
}

이제 date dataType을 정상처럼 사용하여 밀리초 또는 마이크로초의 정밀도를 얻을 수 있습니다.저의 경우 너비에 대해 Gray의 기존 주석 매개변수를 사용했습니다(마이크로초가 아니라 밀리초의 정밀도만 필요한 경우에 적합).

@DatabaseField(columnName = Constants.TIMESTAMP, dataType = DataType.DATE, width = 3)
private Date timestamp;

마지막으로, 이 특정 문제를 해결하려는 경우 소수점 플래그를 잊지 마십시오.

private static JdbcPooledConnectionSource cSource = new JdbcPooledConnectionSource();
    cSource.setDatabaseType(new MariaDBType());
    cSource.setUrl("jdbc:mysql://localhost:3306/database?useFractionalSeconds=true");
    cSource.setUsername("username");
    cSource.setPassword("password");

언급URL : https://stackoverflow.com/questions/14947832/ormlite-date-in-mysql-mariadb-with-millisecond-precision

반응형