SQL Запрос с плагина и на прямую на сервере.

Сообщения
892
Реакции
149
Помог
25 раз(а)
Здравствуйте.
В плагине следующим запросом создаю таблицу в бд:
C#:
new szQuery[1024];
formatex(szQuery, charsmax(szQuery),
    "CREATE TABLE IF NOT EXISTS `%s`\
    (\
        `PromoName` VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\
        `PromoDescription` VARCHAR(256) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,\
        `PromoMaximumActivate` INT NOT NULL,\
        PRIMARY KEY(`PromoName`)\
    )\
    ENGINE = InnoDB DEFAULT CHARSET = utf8;",
    g_Cvars[CVAR_SQL_TABLE]
);

    new iData[1];
    iData[0] = SQL_CREATE_TABLE;

    SQL_ThreadQuery(g_hSqlTuple, "Query_SqlHandler", szQuery, iData, sizeof(iData));
Таблица имеет следующий вид:
1691337378628.png
И тут я столкнулся с проблемой кодировки, дело в том, что если я шлю запрос напрямую в phpMyAdmin, к примеру:
SQL:
INSERT INTO `promocode` (`PromoName`, `PromoDescription`, `PromoMaximumActivate`) VALUES ('TestPromo', 'Тест', 15);
Тогда всё окей, но если я добавляю его из плагина следующим кодом:
C#:
public ClCmd_AddPromoCode(UserId, LevelId, Cid) {
    if(g_Cvars[CVAR_ACCESS][0] && ~get_user_flags(UserId) & read_flags(g_Cvars[CVAR_ACCESS])) {
        console_print(UserId, "%l", "CONSOLE_PRINT_NO_ACCESS");
        return PLUGIN_HANDLED;
    }

    enum {
        Arg_Name = 1,
        Arg_Desc,
        Arg_MaxActivate
    };

    new szPromoCodeName[64], szPromoCodeDescription[256], szPromoCodeMaxActivate[16], iPromoMaxActivate, szQuery[1024], iData[1];

    read_argv(Arg_Name, szPromoCodeName, charsmax(szPromoCodeName));
    read_argv(Arg_Desc, szPromoCodeDescription, charsmax(szPromoCodeDescription));
    read_argv(Arg_MaxActivate, szPromoCodeMaxActivate, charsmax(szPromoCodeMaxActivate));

    if(read_argc() < 4) {
        console_print(UserId, "%l", "CONSOLE_PRINT_USAGE_ADD");
        return PLUGIN_HANDLED;
    }

    iPromoMaxActivate = str_to_num(szPromoCodeMaxActivate);

    trim(szPromoCodeName);
    trim(szPromoCodeDescription);

    remove_quotes(szPromoCodeName);
    remove_quotes(szPromoCodeDescription);

    formatex(szQuery, charsmax(szQuery),
        "INSERT INTO `%s` (`PromoName`, `PromoDescription`, `PromoMaximumActivate`) VALUES ('%s', '%s', '%i');",
        g_Cvars[CVAR_SQL_TABLE], szPromoCodeName, szPromoCodeDescription, iPromoMaxActivate
    );

    iData[0] = SQL_ADD_PROMOCODE;
    SQL_ThreadQuery(g_hSqlTuple, "Query_SqlHandler", szQuery, iData, sizeof(iData));

    static iRet;
    ExecuteForward(g_Forwards[FORWARD_ADD], iRet, UserId, szPromoCodeName, szPromoCodeDescription, iPromoMaxActivate);

    return PLUGIN_HANDLED;
}
То получается, что у меня в таблицу записывает иероглифы (все есть на скрине ниже).
Что я делаю не так, как это пофиксить?
1691337670239.png
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
в phpMyAdmins есть настройка Сопоставление кодировки соединения, какая там кодировка?
 
Сообщения
397
Реакции
221
Помог
13 раз(а)
ImmortalAmxx,
Код:
SQL_SetCharset(g_hSqlTuple,"utf8");
Код:
public ClCmd_AddPromoCode(UserId, LevelId, Cid) {
    if(g_Cvars[CVAR_ACCESS][0] && ~get_user_flags(UserId) & read_flags(g_Cvars[CVAR_ACCESS])) {
        console_print(UserId, "%l", "CONSOLE_PRINT_NO_ACCESS");
        return PLUGIN_HANDLED;
    }

    enum {
        Arg_Name = 1,
        Arg_Desc,
        Arg_MaxActivate
    };

    new szPromoCodeName[64], szPromoCodeDescription[256], szPromoCodeMaxActivate[16], iPromoMaxActivate, szQuery[1024], iData[1];

    read_argv(Arg_Name, szPromoCodeName, charsmax(szPromoCodeName));
    read_argv(Arg_Desc, szPromoCodeDescription, charsmax(szPromoCodeDescription));
    read_argv(Arg_MaxActivate, szPromoCodeMaxActivate, charsmax(szPromoCodeMaxActivate));

    if(read_argc() < 4) {
        console_print(UserId, "%l", "CONSOLE_PRINT_USAGE_ADD");
        return PLUGIN_HANDLED;
    }

    iPromoMaxActivate = str_to_num(szPromoCodeMaxActivate);

    trim(szPromoCodeName);
    trim(szPromoCodeDescription);

    remove_quotes(szPromoCodeName);
    remove_quotes(szPromoCodeDescription);

    formatex(szQuery, charsmax(szQuery),
        "INSERT INTO `%s` (`PromoName`, `PromoDescription`, `PromoMaximumActivate`) VALUES ('%s', '%s', '%i');",
        g_Cvars[CVAR_SQL_TABLE], szPromoCodeName, szPromoCodeDescription, iPromoMaxActivate
    );

    iData[0] = SQL_ADD_PROMOCODE;
+ SQL_SetCharset(g_hSqlTuple,"utf8");
    SQL_ThreadQuery(g_hSqlTuple, "Query_SqlHandler", szQuery, iData, sizeof(iData));

    static iRet;
    ExecuteForward(g_Forwards[FORWARD_ADD], iRet, UserId, szPromoCodeName, szPromoCodeDescription, iPromoMaxActivate);

    return PLUGIN_HANDLED;
}
 
Сообщения
892
Реакции
149
Помог
25 раз(а)
Javekson, если правильно понял вопрос, то utf8mb3_unicode_ci, попробовал сменить на utf8mb4_general_ci, но результата не дало.
SQL_SetCharset помог, всем спасибо, кто откликнулся.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу