From 2b85c75b7f9a0d6dfd990ddcd5a1784a8318134b Mon Sep 17 00:00:00 2001 From: Risto Lahtela <24460436+Rsl1122@users.noreply.github.com> Date: Sat, 8 Aug 2020 17:49:15 +0300 Subject: [PATCH] Use utf8mb4 by default on every VARCHAR field on MySQL Added instructions for users experiencing errorcode 1366 Affects issues: - Fixed #1509 --- .../djrapitops/plan/exceptions/database/DBOpException.java | 4 ++++ .../storage/database/sql/building/CreateTableBuilder.java | 3 +++ .../storage/database/sql/building/CreateTableBuilderTest.java | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java index 7da99f207..72d3c9785 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/exceptions/database/DBOpException.java @@ -131,6 +131,10 @@ public class DBOpException extends IllegalStateException implements ExceptionWit case 1213: context.related("Deadlock"); break; + case 1366: + context.related("Incorrect character encoding in MySQL") + .whatToDo("Convert your MySQL database and tables to use uft8mb4: https://www.a2hosting.com/kb/developer-corner/mysql/convert-mysql-database-utf-8"); + break; default: context.related("Unknown SQL Error code"); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilder.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilder.java index 523058ef3..972d4efb1 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilder.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilder.java @@ -60,6 +60,9 @@ public class CreateTableBuilder { finalizeColumn(); columnBuilder = new StringBuilder(); columnBuilder.append(column).append(" ").append(type); + if (dbType == DBType.MYSQL && type.contains("varchar(")) { + columnBuilder.append(" CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci"); + } return this; } diff --git a/Plan/common/src/test/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilderTest.java b/Plan/common/src/test/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilderTest.java index 7a55b3f89..569893984 100644 --- a/Plan/common/src/test/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilderTest.java +++ b/Plan/common/src/test/java/com/djrapitops/plan/storage/database/sql/building/CreateTableBuilderTest.java @@ -31,7 +31,7 @@ class CreateTableBuilderTest { @Test void createsSameTablesAsOldParser() { - String expected = "CREATE TABLE IF NOT EXISTS plan_servers (id integer NOT NULL AUTO_INCREMENT,uuid varchar(36) NOT NULL UNIQUE,name varchar(100),web_address varchar(100),is_installed boolean NOT NULL DEFAULT 1,max_players integer NOT NULL DEFAULT -1,PRIMARY KEY (id))"; + String expected = "CREATE TABLE IF NOT EXISTS plan_servers (id integer NOT NULL AUTO_INCREMENT,uuid varchar(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL UNIQUE,name varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,web_address varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,is_installed boolean NOT NULL DEFAULT 1,max_players integer NOT NULL DEFAULT -1,PRIMARY KEY (id))"; String result = CreateTableBuilder.create(ServerTable.TABLE_NAME, DBType.MYSQL) .column(ServerTable.SERVER_ID, Sql.INT) .primaryKey()