关于jdbc:存储到PostgreSQL TEXT时是否有最大长度

Is there a maximum length when storing into PostgreSQL TEXT

我有一系列长度变化很大的字符串:从30到282420个字符。我想使用jdbc将每个字符串存储到postgres数据库中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     String query ="INSERT INTO" + tableName +
                      " (cbsID, ownerID, naam, soortRegio, jaar, centroidLat, centroidLon, borders)" +
                      " VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
     PreparedStatement ps = connection.prepareStatement(query);
     FOR (Marker marker: gemeenteMarkers)
     {
        Area gemeente = (Area) marker.getProperty("area");
        String sloc ="";

        // ... do SOME computations
        // Compute sloc, a string that may contain OVER 250.000 characters
        ps.setInt (1, gemeente.getAreaId ());
        ps.setInt (2, gemeente.getParentId ());
        ps.setString (3, gemeente.getAreaName ());
        ps.setString (4,"GM");
        ps.setInt (5, 2014);
        ps.setFloat (6, gemeente.getCentroid ().getLat ());
        ps.setFloat (7, gemeente.getCentroid ().getLon ());
        ps.setString (8, slocs);
        System.out.printf ("%s - %d locations, len = %d
"
, gemeente.getAreaName (), locs.size (), slocs.length ());

        ps.addBatch ();
     } // FOR
     INT [] affected = ps.executeBatch ();

slocs之外,信息存储在数据库中,slocs包含提到的字符串并存储在"border"列中。请参阅下面的pdAdmin截图。
Screenshot of the table. Notice the absence of a lot of elements in the boder column

边框定义为TEXT。正如您在大多数情况下所看到的那样,它不会被存储,除非它很短,通常小于7000个字符。代码包含print语句,输出的一部分如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Appingedam - 1649 locations, len = 32980
Bedum - 1210 locations, len = 24200
Bellingwedde - 1500 locations, len = 30000
Ten Boer - 1186 locations, len = 23720
Delfzijl - 16 locations, len = 320
Groningen - 2662 locations, len = 53240
Grootegast - 4843 locations, len = 96860
Haren - 1940 locations, len = 38800
Hoogezand-Sappemeer - 1481 locations, len = 29620
Leek - 2575 locations, len = 51500
Loppersum - 2991 locations, len = 59820
Marum - 1936 locations, len = 38720
Almere - 213 locations, len = 4260
Stadskanaal - 2701 locations, len = 54020
Slochteren - 1555 locations, len = 31100
Veendam - 1098 locations, len = 21960
Vlagtwedde - 2621 locations, len = 52420
Zeewolde - 25 locations, len = 500
Winsum - 2992 locations, len = 59840
Zuidhorn - 5282 locations, len = 105640
Dongeradeel - 256 locations, len = 5120
Achtkarspelen - 4644 locations, len = 92880
Ameland - 158 locations, len = 3160
het Bildt - 2337 locations, len = 46740
Franekeradeel - 50 locations, len = 1000
Harlingen - 50 locations, len = 1000
Heerenveen - 5195 locations, len = 103900

在postgres手册中我找到了

If you desire to store long strings with no specific upper limit, use
text or character varying without a length specifier, rather than
making up an arbitrary length limit.

似乎有一些长度限制,因为只有短文本显示在pgAdmin屏幕中。有谁知道我做错了什么?

编辑1

很抱歉不清楚。我添加了代码示例,我已经包含了程序的输出和pgAdmin来显示表中的数据。

编辑2

我在示例中添加了executeBatch。它存在于原始代码中,输出不会改变。


根据Postgres字符类型文档,textvariable unlimited length
进一步向下:

... PostgreSQL provides the text type, which stores strings of any length.

然而

根据Postgres Wiki,单个列值的硬限制为1GB,因此架构限制为"无限"长度text值的实际限制为1GB。


关于缺乏例子,有一些合理的评论。 在玩这些例子时,我偶然发现了pgAdmin的一些显着行为:它没有显示存在的信息。 只需在pgAdmin数据编辑器的输出中选择一些行,这些行显示在原始问题中并将其粘贴到编辑器中。 然后它会显示在pgAdmin的数据显示中看不到的信息,见下文。

1
2
3
4
5
6
7
8
9
10
3;0;"Appingedam";"GM";2014;53.3172;6.84957;"53.345131 6.885408  53.344925 6.885422  ...
5;0;"
Bedum";"GM";2014;53.2949;6.59717;"53.255638 6.587573  53.255646 6.587514  53.25...
7;0;"Bellingwedde";"GM";2014;53.0986;7.12118;"53.097076 7.038233  53.097099 7.038254...
9;0;"
Ten Boer";"GM";2014;53.2788;6.69145;"53.312183 6.740470  53.312176 6.740486  53...
10;0;"Delfzijl";"GM";2014;53.3227;7.09945;"53.322491 7.100943  53.322414 7.100940  5...
14;0;"
Groningen";"GM";2014;53.2222;6.5634;"53.198223 6.515755  53.198238 6.515728  5...
15;0;"Grootegast";"GM";2014;53.2086;6.27322;"53.203838 6.318381  53.203819 6.318180 ...
17;0;"
Haren";"GM";2014;53.1545;6.63106;"53.165165 6.560897  53.165207 6.560884  53.1...
18;0;"Hoogezand-Sappemeer";"GM";2014;53.1473;6.7468;"53.116516 6.743022  53.116371 6...
22;0;"
Leek";"GM";2014;53.1633;6.36926;"53.211250 6.362241  53.211262 6.362327  53.21...

因此,似乎pgAdmin表现得像你没有看到的是你没有得到的。 Java,jdbc和Postgres的行为与预期的一样,pgAdmin没有。