Skip to content

Commit ed9a94f

Browse files
committed
feat: create opt-out setting "ForceUnicode", for sessions which shall not force Unicode communication
https://www.heidisql.com/forum.php?t=45113
1 parent 7cfdb97 commit ed9a94f

2 files changed

Lines changed: 18 additions & 9 deletions

File tree

source/apphelpers.pas

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ TWinControlHelper = class helper for TWinControl
186186
asWrapLongLines, asCodeFolding, asDisplayBLOBsAsText, asSingleQueries, asMemoEditorWidth, asMemoEditorHeight, asMemoEditorMaximized,
187187
asMemoEditorWrap, asMemoEditorHighlighter, asMemoEditorAlwaysFormatCode, asDelimiter, asSQLHelpWindowLeft, asSQLHelpWindowTop, asSQLHelpWindowWidth,
188188
asSQLHelpWindowHeight, asSQLHelpPnlLeftWidth, asSQLHelpPnlRightTopHeight, asHost,
189-
asUser, asPassword, asCleartextPluginEnabled, asWindowsAuth, asLoginPrompt, asPort, asLibrary, asAllProviders,
189+
asUser, asPassword, asCleartextPluginEnabled, asForceUnicode, asWindowsAuth, asLoginPrompt, asPort, asLibrary, asAllProviders,
190190
asSSHtunnelActive, asPlinkExecutable, asSshExecutable, asSSHtunnelHost, asSSHtunnelHostPort, asSSHtunnelPort, asSSHtunnelUser,
191191
asSSHtunnelPassword, asSSHtunnelTimeout, asSSHtunnelPrivateKey, asSSLActive, asSSLKey,
192192
asSSLCert, asSSLCA, asSSLCipher, asSSLVerification, asSSLWarnUnused, asNetType, asCompressed, asLocalTimeZone, asQueryTimeout, asKeepAlive,
@@ -3637,6 +3637,7 @@ constructor TAppSettings.Create;
36373637
InitSetting(asUser, 'User', 0, False, '', True);
36383638
InitSetting(asPassword, 'Password', 0, False, '', True);
36393639
InitSetting(asCleartextPluginEnabled, 'CleartextPluginEnabled', 0, False, '', True);
3640+
InitSetting(asForceUnicode, 'ForceUnicode', 0, True, '', True);
36403641
InitSetting(asWindowsAuth, 'WindowsAuth', 0, False, '', True);
36413642
InitSetting(asLoginPrompt, 'LoginPrompt', 0, False, '', True);
36423643
InitSetting(asPort, 'Port', 0, False, '', True);

source/dbconnection.pas

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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;
44664474
end;
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);
75367544
end;
75377545

75387546

0 commit comments

Comments
 (0)