Skip to content

Commit f1acc1f

Browse files
committed
Use the backend server charset
The default character set should be copied from the server so that MaxScale appears to be the same. This fixes problems where utf8mb4 couldn't be taken into use because MaxScale would always send latin1 as the server charset.
1 parent b50e794 commit f1acc1f

4 files changed

Lines changed: 15 additions & 0 deletions

File tree

server/core/dbusers.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2612,6 +2612,11 @@ static bool check_server_permissions(SERVICE *service, SERVER* server,
26122612
return my_errno != ER_ACCESS_DENIED_ERROR;
26132613
}
26142614

2615+
/** Copy the server charset */
2616+
MY_CHARSET_INFO cs_info;
2617+
mysql_get_character_set_info(mysql, &cs_info);
2618+
server->charset = cs_info.number;
2619+
26152620
if (server->server_string == NULL)
26162621
{
26172622
const char *server_string = mysql_get_server_info(mysql);

server/core/server.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@
4444
#include <log_manager.h>
4545
#include <gw_ssl.h>
4646

47+
/** The latin1 charset */
48+
#define SERVER_DEFAULT_CHARSET 0x08
49+
4750
static SPINLOCK server_spin = SPINLOCK_INIT;
4851
static SERVER *allServers = NULL;
4952

@@ -89,6 +92,7 @@ server_alloc(char *servname, char *protocol, unsigned short port)
8992
server->persistmaxtime = 0;
9093
server->persistpoolmax = 0;
9194
server->slave_configured = false;
95+
server->charset = SERVER_DEFAULT_CHARSET;
9296
spinlock_init(&server->persistlock);
9397

9498
spinlock_acquire(&server_spin);

server/include/server.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ typedef struct server
109109
long persistpoolmax; /**< Maximum size of persistent connections pool */
110110
long persistmaxtime; /**< Maximum number of seconds connection can live */
111111
int persistmax; /**< Maximum pool size actually achieved since startup */
112+
uint8_t charset; /**< Default server character set */
112113
#if defined(SS_DEBUG)
113114
skygw_chk_t server_chk_tail;
114115
#endif

server/modules/protocol/mysql_client.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,11 @@ int MySQLSendHandshake(DCB* dcb)
277277
int len_version_string = 0;
278278
int id_num;
279279

280+
if (dcb->service->dbref)
281+
{
282+
mysql_server_language = dcb->service->dbref->server->charset;
283+
}
284+
280285
MySQLProtocol *protocol = DCB_PROTOCOL(dcb, MySQLProtocol);
281286
GWBUF *buf;
282287

0 commit comments

Comments
 (0)