存储到PostgreSQL TEXT时是否有最大长度

时间:2016-10-10 19:57:33

标签: postgresql jdbc

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

     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\n", gemeente.getAreaName (), locs.size (), slocs.length ());

        ps.addBatch ();
     } // for
     int [] affected = ps.executeBatch ();

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

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

executeBatch

在postgres手册中我找到了

  

如果您希望存储没有特定上限的长字符串,请使用   文本或字符在没有长度说明符的情况下变化,而不是   构成任意长度限制。

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

修改1

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

修改2

我在示例中添加了>>> from py2neo import Graph >>> myGraph = Graph(password='xxxx') 。它存在于原始代码中,输出不会改变。

2 个答案:

答案 0 :(得分:10)

根据Postgres character type documentationtextvariable unlimited length 再往下:

  

... PostgreSQL提供text类型,它存储任意长度的字符串。

<强>然而

根据Postgres Wiki,单个列值的硬限制为1GB,因此实际限制为&#34;无限制&#34;体系结构将text长度限制为1GB。

答案 1 :(得分:0)

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

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没有。