@@ -196,6 +196,7 @@ private final class FreeTDSConnection: @unchecked Sendable {
196196 _ = dbsetlname ( login, user, Int32 ( DBSETUSER) )
197197 _ = dbsetlname ( login, password, Int32 ( DBSETPWD) )
198198 _ = dbsetlname ( login, " TablePro " , Int32 ( DBSETAPP) )
199+ _ = dbsetlname ( login, " UTF-8 " , Int32 ( DBSETCHARSET) )
199200 _ = dbsetlversion ( login, UInt8 ( DBVERSION_74) )
200201
201202 freetdsLastError = " "
@@ -371,10 +372,12 @@ private final class FreeTDSConnection: @unchecked Sendable {
371372 return String ( bytes: UnsafeBufferPointer ( start: ptr, count: Int ( srcLen) ) , encoding: . utf8)
372373 ?? String ( bytes: UnsafeBufferPointer ( start: ptr, count: Int ( srcLen) ) , encoding: . isoLatin1)
373374 case Int32 ( SYBNCHAR) , Int32 ( SYBNVARCHAR) , Int32 ( SYBNTEXT) :
374- let data = Data ( bytes: ptr, count: Int ( srcLen) )
375- return String ( data: data, encoding: . utf16LittleEndian)
375+ // With client charset UTF-8, FreeTDS converts UTF-16 wire data to UTF-8
376+ // but may still report the original nvarchar type token
377+ return String ( bytes: UnsafeBufferPointer ( start: ptr, count: Int ( srcLen) ) , encoding: . utf8)
378+ ?? String ( data: Data ( bytes: ptr, count: Int ( srcLen) ) , encoding: . utf16LittleEndian)
376379 default :
377- let bufSize : DBINT = 64
380+ let bufSize : DBINT = 256
378381 var buf = [ BYTE] ( repeating: 0 , count: Int ( bufSize) )
379382 let converted = buf. withUnsafeMutableBufferPointer { bufPtr in
380383 dbconvert ( proc, srcType, ptr, srcLen, Int32 ( SYBCHAR) , bufPtr. baseAddress, bufSize)
0 commit comments