Skip to content

Commit cb137d8

Browse files
authored
Merge pull request #220 from kubo39/utf8mb4
Use utf8mb4 by default
2 parents 8e8547b + c2b2f26 commit cb137d8

File tree

1 file changed

+34
-6
lines changed

1 file changed

+34
-6
lines changed

source/mysql/protocol/comms.d

+34-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ Next tasks for this sub-package's cleanup:
2121
module mysql.protocol.comms;
2222

2323
import std.algorithm;
24+
import std.array;
2425
import std.conv;
2526
import std.digest.sha;
2627
import std.exception;
@@ -45,7 +46,7 @@ package struct ProtocolPrepared
4546
import std.datetime;
4647
import std.variant;
4748
import mysql.types;
48-
49+
4950
static ubyte[] makeBitmap(in Variant[] inParams)
5051
{
5152
size_t bml = (inParams.length+7)/8;
@@ -451,7 +452,7 @@ package struct ProtocolPrepared
451452
Variant[] inParams, ParameterSpecialization[] psa)
452453
{
453454
conn.autoPurge();
454-
455+
455456
ubyte[] packet;
456457
conn.resetPacket();
457458

@@ -771,7 +772,7 @@ body
771772
}
772773

773774
conn.autoPurge();
774-
775+
775776
conn.resetPacket();
776777

777778
ubyte[] header;
@@ -810,7 +811,7 @@ body
810811
// Request a conventional maximum packet length.
811812
1.packInto(packet[8..12]);
812813

813-
packet ~= 33; // Set UTF-8 as default charSet
814+
packet ~= getDefaultCollation(conn._serverVersion);
814815

815816
// There's a statutory block of zero bytes here - fill them in.
816817
foreach(i; 0 .. 23)
@@ -967,7 +968,7 @@ package(mysql) SvrCapFlags setClientFlags(SvrCapFlags serverCaps, SvrCapFlags ca
967968
// didn't supply it
968969
cCaps |= SvrCapFlags.PROTOCOL41;
969970
cCaps |= SvrCapFlags.SECURE_CONNECTION;
970-
971+
971972
return cCaps;
972973
}
973974

@@ -998,7 +999,7 @@ package(mysql) PreparedServerInfo performRegister(Connection conn, const(char[])
998999
scope(failure) conn.kill();
9991000

10001001
PreparedServerInfo info;
1001-
1002+
10021003
conn.sendCmd(CommandType.STMT_PREPARE, sql);
10031004
conn._fieldCount = 0;
10041005

@@ -1112,3 +1113,30 @@ package(mysql) void enableMultiStatements(Connection conn, bool on)
11121113
auto packet = conn.getPacket();
11131114
enforce!MYXProtocol(packet[0] == 254 && packet.length == 5, "Unexpected response to SET_OPTION command");
11141115
}
1116+
1117+
private ubyte getDefaultCollation(string serverVersion)
1118+
{
1119+
// MySQL >= 5.5.3 supports utf8mb4
1120+
const v = serverVersion
1121+
.splitter('.')
1122+
.map!(a => a.parse!ushort)
1123+
.array;
1124+
1125+
if (v[0] < 5)
1126+
return 33; // Set utf8_general_ci as default
1127+
if (v[1] < 5)
1128+
return 33; // Set utf8_general_ci as default
1129+
if (v[2] < 3)
1130+
return 33; // Set utf8_general_ci as default
1131+
1132+
return 45; // Set utf8mb4_general_ci as default
1133+
}
1134+
1135+
unittest
1136+
{
1137+
assert(getDefaultCollation("5.5.3") == 45);
1138+
assert(getDefaultCollation("5.5.2") == 33);
1139+
1140+
// MariaDB: https://mariadb.com/kb/en/connection/#initial-handshake-packet
1141+
assert(getDefaultCollation("5.5.5-10.0.7-MariaDB") == 45);
1142+
}

0 commit comments

Comments
 (0)