Skip to content

Commit c309aae

Browse files
committed
Initial changes
1 parent 41c1f8a commit c309aae

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

src/main/java/com/microsoft/sqlserver/jdbc/Parameter.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,18 +415,22 @@ void setValue(JDBCType jdbcType, Object value, JavaType javaType, StreamSetterAr
415415
// the value with the appropriate corresponding Unicode type.
416416
// JavaType.OBJECT == javaType when calling setNull()
417417
if (con.sendStringParametersAsUnicode() && (JavaType.STRING == javaType || JavaType.READER == javaType
418-
|| JavaType.CLOB == javaType || JavaType.OBJECT == javaType)) {
418+
|| JavaType.CLOB == javaType || JavaType.OBJECT == javaType) && jdbcType != JDBCType.VARCHAR) {
419419
jdbcType = getSSPAUJDBCType(jdbcType);
420420
}
421421

422422
DTV newDTV = new DTV();
423423
newDTV.setValue(con.getDatabaseCollation(), jdbcType, value, javaType, streamSetterArgs, calendar, scale, con,
424424
forceEncrypt);
425425

426-
if (!con.sendStringParametersAsUnicode()) {
426+
if (!con.sendStringParametersAsUnicode() || (con.sendStringParametersAsUnicode() && jdbcType == JDBCType.VARCHAR)) {
427427
newDTV.sendStringParametersAsUnicode = false;
428428
}
429429

430+
if (con.sendStringParametersAsUnicode() && jdbcType == JDBCType.VARCHAR && (!con.getDatabaseCollation().isUtf8Encoding() || con.getServerMajorVersion() < 15)) {
431+
throw new SQLServerException(SQLServerException.getErrString("R_possibleColumnDataCorruption"), null);
432+
}
433+
430434
inputDTV = setterDTV = newDTV;
431435
}
432436

src/main/java/com/microsoft/sqlserver/jdbc/SQLCollation.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ final boolean hasAsciiCompatibleSBCS() {
5656
return encoding.hasAsciiCompatibleSBCS();
5757
}
5858

59+
boolean isUtf8Encoding() {
60+
return encoding.equals(Encoding.UTF8);
61+
}
62+
5963
static final int tdsLength() {
6064
return TDS_LENGTH;
6165
} // Length of collation in TDS (in bytes)

src/main/java/com/microsoft/sqlserver/jdbc/SQLServerResource.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ protected Object[][] getContents() {
165165
{"R_invalidDatetimeType", "The datetimeType connection property {0} is not valid."},
166166
{"R_dataAlreadyAccessed", "The data has been accessed and is not available for this column or parameter."},
167167
{"R_outParamsNotPermittedinBatch", "The OUT and INOUT parameters are not permitted in a batch."},
168+
{"R_possibleColumnDataCorruption", "Attempted to insert encrypted unicode data into non-unicode column. Data corruption may occur."},
168169
{"R_colNotMatchTable", "Number of provided columns {0} does not match the table definition {1}."},
169170
{"R_invalidSQL", "Invalid SQL query {0}."},
170171
{"R_multipleQueriesNotAllowed", "Multiple queries are not allowed."},

0 commit comments

Comments
 (0)