@@ -21,6 +21,7 @@ Next tasks for this sub-package's cleanup:
2121module mysql.protocol.comms ;
2222
2323import std.algorithm ;
24+ import std.array ;
2425import std.conv ;
2526import std.digest.sha ;
2627import 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
771772 }
772773
773774 conn.autoPurge();
774-
775+
775776 conn.resetPacket();
776777
777778 ubyte [] header;
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