Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

UTC में DATETIME और TIMESTAMP की समझदारी से निपटने के लिए JDBC-mysql ड्राइवर सेटिंग्स क्या हैं?

समाधान JDBC कनेक्शन पैरामीटर सेट करना है noDatetimeStringSync=true useLegacyDatetimeCode=false . के साथ . एक बोनस के रूप में मुझे sessionVariables=time_zone='-00:00' भी मिला set time_zone . की आवश्यकता को कम करता है हर नए कनेक्शन पर स्पष्ट रूप से।

कुछ "बुद्धिमान" टाइमज़ोन रूपांतरण कोड है जो ResultSet.getString() के अंदर गहराई से सक्रिय हो जाता है विधि जब यह पता लगाती है कि कॉलम एक TIMESTAMP है कॉलम।

काश, इस बुद्धिमान कोड में एक बग होता है:TimeUtil.fastTimestampCreate(TimeZone tz, int year, int month, int day, int hour, int minute, int seconds, int secondsPart) एक Timestamp देता है JVM के डिफ़ॉल्ट टाइमज़ोन में गलत टैग किया गया, तब भी जब tz पैरामीटर कुछ और पर सेट है:

final static Timestamp fastTimestampCreate(TimeZone tz, int year, int month, int day, int hour, int minute, int seconds, int secondsPart) {
    Calendar cal = (tz == null) ? new GregorianCalendar() : new GregorianCalendar(tz);
    cal.clear();

    // why-oh-why is this different than java.util.date, in the year part, but it still keeps the silly '0' for the start month????
    cal.set(year, month - 1, day, hour, minute, seconds);

    long tsAsMillis = cal.getTimeInMillis();

    Timestamp ts = new Timestamp(tsAsMillis);
    ts.setNanos(secondsPart);

    return ts;
}

वापसी ts कॉल श्रृंखला में आगे बढ़ने को छोड़कर पूरी तरह से मान्य होगा, इसे नंगे toString() का उपयोग करके वापस एक स्ट्रिंग में परिवर्तित किया जाता है विधि, जो ts . प्रदान करती है एक स्ट्रिंग के रूप में यह दर्शाता है कि यूटीसी में समय के स्ट्रिंग प्रतिनिधित्व के बजाय जेवीएम-डिफ़ॉल्ट टाइमज़ोन में घड़ी क्या प्रदर्शित करेगी। ResultSetImpl.getStringInternal(int columnIndex, boolean checkDateTypes) में :

                case Types.TIMESTAMP:
                    Timestamp ts = getTimestampFromString(columnIndex, null, stringVal, this.getDefaultTimeZone(), false);

                    if (ts == null) {
                        this.wasNullFlag = true;

                        return null;
                    }

                    this.wasNullFlag = false;

                    return ts.toString();

सेटिंग noDatetimeStringSync=true संपूर्ण पार्स/अनपार्स मेस को अक्षम कर देता है और डेटाबेस से प्राप्त स्ट्रिंग मान को केवल लौटाता है।

टेस्ट आउटपुट:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

useLegacyDatetimeCode=false अभी भी महत्वपूर्ण है क्योंकि यह getDefaultTimeZone() . के व्यवहार को बदल देता है डेटाबेस सर्वर के TZ का उपयोग करने के लिए।

इसका पीछा करते हुए मुझे useJDBCCompliantTimezoneShift के लिए दस्तावेज़ भी मिले गलत है, हालांकि इससे कोई फर्क नहीं पड़ता:प्रलेखन कहता है [यह विरासत दिनांक-समय कोड का हिस्सा है, इस प्रकार संपत्ति का प्रभाव तभी पड़ता है जब "useLegacyDatetimeCode=true." ], लेकिन यह गलत है, देखें ResultSetImpl.getNativeTimestampViaParseConversion(int, Calendar, TimeZone, boolean)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL में चालू माह का रिकॉर्ड कैसे प्राप्त करें

  2. PHP-MYSQL:यूनिक्स टाइमस्टैम्प को डेटटाइम में कनवर्ट करना और इसके विपरीत

  3. मैसकल समूह दो कॉलम से और तीसरे कॉलम का अधिकतम मूल्य चुनें

  4. Oracle में DECODE फ़ंक्शन के MySQL समकक्ष

  5. docx फ़ाइल की सामग्री प्राप्त करें जो php . में ब्लॉब प्रकार के रूप में mysql dabase में सहेजी गई है