diff --git a/src/database/disk.sql b/src/database/disk.sql
index 285457514f1585114e3412b91a7b73c46e9147fa..5ebe5772cd1e061d34a1e58bdad9f94b445d42ef 100644
--- a/src/database/disk.sql
+++ b/src/database/disk.sql
@@ -104,7 +104,7 @@ CREATE TABLE IF NOT EXISTS 'stickers'
   , name    TEXT    NOT NULL UNIQUE
   );
 
-CREATE TABLE IF NOT EXISTS 'stickers.song'
+CREATE TABLE IF NOT EXISTS 'stickers.kara'
   ( id      INTEGER REFERENCES kara     ON DELETE CASCADE
   , sticker INTEGER REFERENCES stickers ON DELETE CASCADE
   , value   INTEGER NOT NULL
diff --git a/src/database/find.c b/src/database/find.c
index 8cab8488045c254566baf24ab05c845ff6fff6b3..9df51114d8233b26dac02bf5fbfe44755c388d88 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -37,27 +37,27 @@ database_search_sticker_init(volatile sqlite3 *db, struct lkt_search *ret)
 {
     /* No bound checks in strcats, should be fine. Possible SQL injection, depend on the `type`. */
     static const char *SQL_all_types =
-        "SELECT name, sts.id, value FROM 'stickers' LEFT OUTER JOIN "
-        "( SELECT id, sticker, value FROM 'stickers.song'"
+        "SELECT name, sts.id, value FROM 'stickers' JOIN "
+        "( SELECT id, sticker, value FROM 'stickers.kara'"
         "  UNION"
         "  SELECT id, sticker, value FROM 'stickers.plt'"
         ") AS sts"
         "ON sts.sticker = 'stickers'.id";
     static const char *SQL_one_type =
-        "SELECT name, 'stickers.%s'.id, value "
-        "FROM 'stickers.%s' AS sts"
-        "LEFT OUTER JOIN 'stickers' "
+        "SELECT name, sts.id, value "
+        "FROM 'stickers.%s' AS sts "
+        "JOIN 'stickers' "
         "ON 'stickers'.id = sts.sticker";
     char SQL[LKT_MAX_SQLITE_STATEMENT];
 
     if (ret->st_type == NULL)
         memcpy(SQL, SQL_all_types, strlen(SQL_all_types) + 1);
     else
-        sprintf(SQL, SQL_one_type, ret->st_type, ret->st_type);
+        sprintf(SQL, SQL_one_type, ret->st_type);
     if (ret->st_uri != 0)
-        sprintf(SQL, " AND sts.id = %d", ret->st_uri);
+        sprintf(SQL + strlen(SQL), " AND sts.id = %d", ret->st_uri);
     if (ret->st_op != 0)
-        sprintf(SQL, " AND sts.value %s %d",
+        sprintf(SQL + strlen(SQL), " AND sts.value %s %d",
                 ret->st_op == '>' ? ">=" : ret->st_op == '<' ? "<=" : "=",
                 ret->st_value);
     strcat(SQL, ret->name ? " AND name = ?;" : ";");
diff --git a/src/database/stickers.c b/src/database/stickers.c
index 8863b827b0d3ac61f982c31ff1d42f0180c3d811..34ca0d4a72fb44501acf05d15c9f8aa2ad565471 100644
--- a/src/database/stickers.c
+++ b/src/database/stickers.c
@@ -58,9 +58,9 @@ database_sticker_set(volatile sqlite3 *db, const char *type, const char *name, i
      * 3 -> the name of the sticker
      */
 
-    if (!strcasecmp(type, "song"))
+    if (!strcasecmp(type, "kara"))
         SQL =
-            "INSERT OR REPLACE INTO 'stickers.song' (id, sticker, value) "
+            "INSERT OR REPLACE INTO 'stickers.kara' (id, sticker, value) "
             "SELECT ?, 'stickers'.id, ? "
             "FROM 'stickers'"
             "WHERE 'stickers'.id = ?;\n";
@@ -94,7 +94,7 @@ database_sticker_delete_specify(volatile sqlite3 *db, const char *type, int uri,
     int ret = false;
 
     /* Base query. */
-    if (strcasecmp("plt", type) && strcasecmp("song", type)) {
+    if (strcasecmp("plt", type) && strcasecmp("kara", type)) {
         LOG_ERROR_SCT("DB", "Type '%s' is invalid", type);
         return false;
     }