@@ -12,7 +12,7 @@ interface
1212 Classes, SysUtils, Generics.Collections, Generics.Defaults,
1313 DateUtils, Types, Math, Dialogs, Graphics, ExtCtrls, StrUtils,
1414 Controls, Forms, IniFiles, Variants, FileUtil,
15- RegExpr, process, Pipes, SQLDB,
15+ RegExpr, process, Pipes, SQLDB, LConvEncoding,
1616 { $IFDEF HASMSSQL} MSSQLConn, SQLDBLib, DB, { $ENDIF}
1717 generic_types, lazaruscompat,
1818 dbstructures, dbstructures.mysql, dbstructures.mssql, dbstructures.postgresql, dbstructures.sqlite, dbstructures.interbase;
@@ -301,7 +301,7 @@ TConnectionParameters = class(TObject)
301301 FIgnoreDatabasePattern: String;
302302 FPort, FSSHPort, FSSHLocalPort, FSSHTimeout, FCounter, FQueryTimeout, FKeepAlive, FSSLVerification: Integer;
303303 FSSHActive, FLoginPrompt, FCompressed, FLocalTimeZone, FFullTableStatus,
304- FWindowsAuth, FWantSSL, FIsFolder, FCleartextPluginEnabled: Boolean;
304+ FWindowsAuth, FWantSSL, FIsFolder, FCleartextPluginEnabled, FForceUnicode : Boolean;
305305 FSessionColor: TColor;
306306 FLastConnect: TDateTime;
307307 FLogFileDdl: Boolean;
@@ -367,6 +367,7 @@ TConnectionParameters = class(TObject)
367367 property LoginPrompt: Boolean read FLoginPrompt write FLoginPrompt;
368368 property WindowsAuth: Boolean read FWindowsAuth write FWindowsAuth;
369369 property CleartextPluginEnabled: Boolean read FCleartextPluginEnabled write FCleartextPluginEnabled;
370+ property ForceUnicode: Boolean read FForceUnicode write FForceUnicode;
370371 property AllDatabasesStr: String read FAllDatabases write FAllDatabases;
371372 property AllDatabasesList: TStringList read GetAllDatabasesList;
372373 property LibraryOrProvider: String read FLibraryOrProvider write FLibraryOrProvider;
@@ -1293,6 +1294,7 @@ constructor TConnectionParameters.Create;
12931294 FLoginPrompt := AppSettings.GetDefaultBool(asLoginPrompt);
12941295 FWindowsAuth := AppSettings.GetDefaultBool(asWindowsAuth);
12951296 FCleartextPluginEnabled := AppSettings.GetDefaultBool(asCleartextPluginEnabled);
1297+ FForceUnicode := AppSettings.GetDefaultBool(asForceUnicode);
12961298 FUsername := DefaultUsername;
12971299 FPassword := AppSettings.GetDefaultString(asPassword);
12981300 FPort := DefaultPort;
@@ -1367,6 +1369,7 @@ constructor TConnectionParameters.Create(SessionRegPath: String);
13671369 FLoginPrompt := AppSettings.ReadBool(asLoginPrompt);
13681370 FWindowsAuth := AppSettings.ReadBool(asWindowsAuth);
13691371 FCleartextPluginEnabled := AppSettings.ReadBool(asCleartextPluginEnabled);
1372+ FForceUnicode := AppSettings.ReadBool(asForceUnicode);
13701373 FPort := MakeInt(AppSettings.ReadString(asPort));
13711374 FCompressed := AppSettings.ReadBool(asCompressed);
13721375 FAllDatabases := AppSettings.ReadString(asDatabases);
@@ -1443,6 +1446,7 @@ procedure TConnectionParameters.SaveToRegistry;
14431446 AppSettings.WriteString(asHost, FHostname);
14441447 AppSettings.WriteBool(asWindowsAuth, FWindowsAuth);
14451448 AppSettings.WriteBool(asCleartextPluginEnabled, FCleartextPluginEnabled);
1449+ AppSettings.WriteBool(asForceUnicode, FForceUnicode);
14461450 AppSettings.WriteString(asUser, FUsername);
14471451 AppSettings.WriteString(asPassword, encrypt(FPassword));
14481452 AppSettings.WriteBool(asLoginPrompt, FLoginPrompt);
@@ -3619,7 +3623,7 @@ procedure TMySQLConnection.Query(SQL: String; DoStoreResult: Boolean=False; LogC
36193623 if IsUnicode then
36203624 NativeSQL := UTF8Encode(SQL)
36213625 else
3622- NativeSQL := AnsiString (SQL);
3626+ NativeSQL := UTF8ToCP1252 (SQL);
36233627 TimerStart := GetTickCount64;
36243628 SetLength(FLastRawResults, 0 );
36253629 FStatementNum := 1 ;
@@ -3732,7 +3736,7 @@ procedure TPGConnection.Query(SQL: String; DoStoreResult: Boolean=False; LogCate
37323736 if IsUnicode then
37333737 NativeSQL := UTF8Encode(SQL)
37343738 else
3735- NativeSQL := AnsiString (SQL);
3739+ NativeSQL := UTF8ToCP1252 (SQL);
37363740 TimerStart := GetTickCount64;
37373741 SetLength(FLastRawResults, 0 );
37383742
@@ -4459,10 +4463,14 @@ procedure TMySQLConnection.SetCharacterSet(CharsetName: String);
44594463 FStatementNum := 0 ;
44604464 Log(lcInfo, ' Changing character set from ' +CharacterSet+' to ' +CharsetName);
44614465 Return := FLib.mysql_set_character_set(FHandle, PAnsiChar(Utf8Encode(CharsetName)));
4466+ // Return value never seems to be <> 0, not even on v3.23 servers, we check it anyway:
44624467 if Return <> 0 then
4463- raise EDbError.Create(LastErrorMsg)
4464- else
4465- FIsUnicode := CharsetName.StartsWith(' utf' , True);
4468+ raise EDbError.Create(LastErrorMsg);
4469+ // Check opt-out setting: if disabled, align the internal IsUnicode flag to the connection charset
4470+ if not FParameters.ForceUnicode then begin
4471+ FIsUnicode := CharacterSet.StartsWith(' utf' , True);
4472+ Log(lcInfo, ' ForceUnicode disabled in settings. Internal IsUnicode flag is now: ' + FIsUnicode.ToInteger.ToString)
4473+ end ;
44664474end ;
44674475
44684476
@@ -7532,7 +7540,7 @@ function TDBConnection.DecodeAPIString(a: AnsiString): String;
75327540 if IsUnicode then
75337541 Result := AnsiToUtf8(a)
75347542 else
7535- Result := String (a);
7543+ Result := CP1252ToUTF8 (a);
75367544end ;
75377545
75387546
0 commit comments