|
10 | 10 |
|
11 | 11 | public class DefaultMapper implements TypeMapper { |
12 | 12 |
|
| 13 | + // The following values assume utf8mb4 encoding which uses 4 bytes per character and |
| 14 | + // quarters the maximum column length accordingly |
| 15 | + private static final long MAX_SIZE_VARCHAR = (65535 + 1) / 4; |
| 16 | + private static final long MAX_SIZE_MEDIUMTEXT = (16777215 + 1) / 4; |
| 17 | + private static final long MAX_SIZE_LONGTEXT = (4294967295L + 1) / 4; |
| 18 | + |
| 19 | + |
13 | 20 | public Object mapToSQL(Object source, Class<?> type) { |
14 | 21 | if (source == null) |
15 | 22 | return null; |
@@ -79,13 +86,13 @@ public Object mapToJava(Object source, Class<?> type) { |
79 | 86 | public SQLType getType(Class<?> type, int size) { |
80 | 87 | if (type.equals(String.class) || type.equals(char[].class)) |
81 | 88 | // Upper limit of 4294967295 exceeds the int boundaries |
82 | | - if (size > 16777215) |
| 89 | + if (size > MAX_SIZE_MEDIUMTEXT) |
83 | 90 | return SQLType.LONGTEXT; |
84 | | - if (size > 65535) |
| 91 | + if (size > MAX_SIZE_VARCHAR) |
85 | 92 | return SQLType.MEDIUMTEXT; |
86 | 93 | if (size > 1) |
87 | 94 | return SQLType.VARCHAR; |
88 | | - if (size == 0) |
| 95 | + if (size == 1) |
89 | 96 | return SQLType.CHAR; |
90 | 97 | if (type.equals(UUID.class)) |
91 | 98 | return SQLType.VARCHAR; |
@@ -118,7 +125,7 @@ public String getTypeParameters(Class<?> type, int size) { |
118 | 125 | if (type.isEnum()) |
119 | 126 | return Arrays.stream(((Class<? extends Enum<?>>) type).getEnumConstants()).map(c -> "'" + c.name() + "'").collect(Collectors.joining(",")); |
120 | 127 | if (type.equals(String.class) || type.equals(char[].class)) |
121 | | - return size > 65535 || size < 1 ? null : String.valueOf(size); |
| 128 | + return size > MAX_SIZE_VARCHAR || size < 1 ? null : String.valueOf(size); |
122 | 129 | if (type.equals(byte[].class)) |
123 | 130 | return String.valueOf(size > 0 ? size : 255); |
124 | 131 | if (type.equals(UUID.class)) |
|
0 commit comments