Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 4 из 4 ПерваяПервая ... 2 3 4
Показано с 31 по 39 из 39
  1. #31
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Fallen A. Посмотреть сообщение
    С хостингами не знаком в принципе :) У меня своя серверная.
    Ну так это не значит, что и у всех остальных своя серверная :)
    Делать свой код устойчивым к ошибкам - хороший тон среди программистов. Так что пара дополнительных запросов для перестраховки не будут лишними :)
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. Пользователь сказал cпасибо:
    oukibt (18.01.2021)
  3. #32
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
     Немного логических рассуждений и теории
    Меня уже долгое время смущал вариант "настройки" кодировки от $continue$, ибо хоть я особо и не интересовался никогда ковырянием кодировки в MySQL (просто нужды не было), но знал, что вот этот запрос:
    1. SET CHARACTER SET 'utf8'

    является групповым. То бишь, отправляя этот единственный запрос, Вы, сразу настраиваете три параметра (*документация*) и он равносилен таким трём запросам:
    1. SET character_set_client = utf8;
    2. SET character_set_results = utf8;
    3. SET collation_connection = @@collation_database;

    И если взглянуть на запросы, которые $continue$ предлагает отправлять, можно заметить там идентичные запросы.

    Но если про "SET CHARACTER SET" я узнал совершенно "случайно", то с запросом "SET NAMES" мне так не повезло и до текущего момента я не знал какие запросы он в себе скрывает. В итоге, документация говорит про три таких запроса:
    1. SET character_set_client = utf8;
    2. SET character_set_connection = utf8;
    3. SET character_set_results = utf8;

    И вновь мы видим запросы на изменение тех же опций, которые мало того, что содержатся в "SET CHARACTER SET", так ещё и впоследствии изменяются отдельными запросами с "utf8" на "cp1251".

    Иными словами, таким вот "решением проблемы с кодировкой", которое дано в теме, Вы каждый раз будете "дёргать" одни и те же опции, изменяя их значение с одного на другое.




    На этой ноте можно было бы закончить, но мне стало интересно окончательно закрыть тему кодировки для SA-MP. И я был бы не я, если бы не поделился найденной информацией с Вами :) Заодно, если я вдруг ошибусь, кто-то сможет меня поправить.

    Маленькая оговорка касаемо определений:
    Сервер - это наш сервер MySQL с базами дарных, блекджеком и всем остальным.
    Клиент - это, в нашем случае, сервер SA-MP
    Так же стоит понимать, что все опции настраивают именно сервер MySQL. Даже опция, связанная с кодировкой запросов от клиента, влияет именно на сервер, так как именно он будет заниматься конвертированием данных. То бишь, уяснили: все операции с данными происходят не на стороне сервера SA-MP или плагина, а именно на стороне сервера MySQL. И всеми опциями мы лишь сообщаем серверу MySQL нужную информацию для того, чтоб он совершил конвертирование.



    Давайте разберёмся с основными опциями, которые нам могут пригодится. В случае с SA-MP нам потребуется всего несколько, так как остальные MySQL либо самостоятельно подстроит под эти запросы, либо они уже настроены как надо по умолчанию.

    • character_set_client - В этой опции указaывается кодировка, в которой будут поступать данные от клиента к серверу.
    • character_set_results - В этой опции указывается кодировка, в которую сервер конвертирует данные перед отправкой их клиенту.
    • character_set_connection - В этой опции указывается кодировка, в которую сервер перекодирует данные, полученные от клиента, перед тем, как начнёт выполнять запрос (клиент->character_set_connection->сервер)


    Собственно, всё. Опция collation_connection, которую предлагает настроить $continue$, для каждой кодировки имеет установку по умолчанию, которая, в случае с utf8, будет равна как раз "utf8_general_ci", поэтому определять её самостоятельно нет смысла.
      Открыть/закрыть
    Если кому интересно, посмотреть "настройки по умолчанию" для той или иной кодировки можно при помощи запроса
    PHP код:
    SHOW COLLATION WHERE charset 'имя_кодировки'
    Результатом запроса будет список всех доступных вариантов представления для указанной кодировке и напротив того представления, которая является представлением по умолчанию, в столбце "Default" будет стоять "Yes".

    Вот пример результата для utf8
    PHP код:
    SHOW COLLATION WHERE charset 'utf8' 






    Теперь осталось действительно решить все проблемы с кодировкой, дабы всё работало как надо.
    В чём заключается проблема? В том, что сервер не знает в какой кодировке работает клиент, из-за чего не может правильно конвертировать данные, пришедшие от клиента и подготовить данные к отправке для клиента. И если Вы взгляните на те 3 опции, что я перечислил выше, то найдёте решение всем проблемам.
    Я не зря расписал то, в чём заключается проблема, ибо если Вы сейчас перечитаете составленное мной определение, то увидите, что в обоих случаях фигурирует именно клиент. А с какой кодировкой работает наш клиент? Правильно, cp1251. Поэтому все те свистопляски с 'utf8', которые устроил $continue$ в своём варианте, бессмысленны (можно разве что в character_set_server передавать "utf8", если Вы не уверены в том, что сервер MySQL изначально настроен под эту кодировку).


    Этих двух запросов должно целиком и полностью хватить для хранения русского текста в базе (с учётом того, что Вы никак не правили остальные настройки кодировки и они выставлены по умолчанию или же настроены правильно):
    1. mysql_query(var_connection, "SET character_set_client = 'cp1251'", false);// Определяем кодировку для запросов от сервера SA-MP к базе
    2. mysql_query(var_connection, "SET character_set_results = 'cp1251'", false);// Определяем кодировку от базы данных к нашему серверу SA-MP

    Как минимум, вся та каша из запросов, что даёт $continue$, точно не нужна.

     Опциональные запросы:
    1. mysql_query(var_connection, "SET SESSION character_set_server='utf8'", false);// Устанавливаем кодировку, в которой данные будут хранится на сервере MySQL (кодировка самого сервера, иными словами)


    P.S. Всё это подкреплено лишь моим маленьким "расследованием" (копанием документации) и простыми тестами на локальном сервере с дефолтными настройками MySQL, так что было бы неплохо проверить все мои доводы в более разных условиях, дабы уже окончательно отшлифовать код, если вдруг я чего-то не учёл.
    Засим я откланиваюсь Надеюсь, что у меня получилось понятно объяснить Вам назначение перечисленных опций. Спасибо за внимание
    Последний раз редактировалось DeimoS; 07.06.2018 в 19:21.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  4. #33
    Аватар для miron.prod
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.03.2020
    Сообщений
    10
    Репутация:
    0 ±
    Не могу разобраться с кодировкой.
    Если использовать такой вариант:

    PHP код:
    mysql_tquery(dbHandle"SET character_set_client = 'cp1251'");
    mysql_tquery(dbHandle"SET character_set_results = 'cp1251'"); 
    То в БД русские символы записываются без проблем, но при запросах к БД - русские символы в виде иероглифов.

    Если использовать такой вариант:

    PHP код:
    mysql_query(dbHandle"SET character_set_client = 'cp1251'"false);
    mysql_query(dbHandle"SET character_set_results = 'cp1251'"false); 
    То если записываем в БД русские символы - они просто отсутствуют вообще, но если запрос идёт на получение данных с БД - то всё в порядке.
    Требуется помощь, пожалуйста.
    Версия: R41-4

  5. #34
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от miron.prod Посмотреть сообщение
    Не могу разобраться с кодировкой.
    Если использовать такой вариант:

    PHP код:
    mysql_tquery(dbHandle"SET character_set_client = 'cp1251'");
    mysql_tquery(dbHandle"SET character_set_results = 'cp1251'"); 
    То в БД русские символы записываются без проблем, но при запросах к БД - русские символы в виде иероглифов.

    Если использовать такой вариант:

    PHP код:
    mysql_query(dbHandle"SET character_set_client = 'cp1251'"false);
    mysql_query(dbHandle"SET character_set_results = 'cp1251'"false); 
    То если записываем в БД русские символы - они просто отсутствуют вообще, но если запрос идёт на получение данных с БД - то всё в порядке.
    Требуется помощь, пожалуйста.
    Версия: R41-4
    Для начала убедись, что у столбцов, куда ты записываешь данные, стоит кодировка utf8_general_ci
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #35
    Аватар для miron.prod
    Пользователь

    Статус
    Оффлайн
    Регистрация
    04.03.2020
    Сообщений
    10
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Для начала убедись, что у столбцов, куда ты записываешь данные, стоит кодировка utf8_general_ci
    Кодировка и у столбцов и у бд utf8_general_ci.
    При этом я заметил, что если я устанавливаю настройки, используя mysql_query и затем отправляю запрос, используя эту же функцию - то всё работает, русские символы записываются в бд. Но если отправить запрос используя mysql_tquery (если настройки установлены с использованием mysql_query) - то русские символы уже не пишутся. Это только у меня такой бред или зависимость есть какая то?
    Последний раз редактировалось miron.prod; 18.01.2021 в 17:02.

  7. #36
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от miron.prod Посмотреть сообщение
    Кодировка и у столбцов и у бд utf8_general_ci.
    При этом я заметил, что если я устанавливаю настройки, используя mysql_query и затем отправляю запрос, используя эту же функцию - то всё работает, русские символы записываются в бд. Но если отправить запрос используя mysql_tquery (если настройки установлены с использованием mysql_query) - то русские символы уже не пишутся. Это только у меня такой бред или зависимость есть какая то?
    Удали файл с логами MySQL, пропиши в OnGameModeInit
    1. mysql_log(ALL);

    После запусти сервер и скинь содержимое логов сюда.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. #37
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
     Немного логических рассуждений и теории
    Меня уже долгое время смущал вариант "настройки" кодировки от $continue$, ибо хоть я особо и не интересовался никогда ковырянием кодировки в MySQL (просто нужды не было), но знал, что вот этот запрос:
    1. SET CHARACTER SET 'utf8'

    является групповым. То бишь, отправляя этот единственный запрос, Вы, сразу настраиваете три параметра (*документация*) и он равносилен таким трём запросам:
    1. SET character_set_client = utf8;
    2. SET character_set_results = utf8;
    3. SET collation_connection = @@collation_database;

    И если взглянуть на запросы, которые $continue$ предлагает отправлять, можно заметить там идентичные запросы.

    Но если про "SET CHARACTER SET" я узнал совершенно "случайно", то с запросом "SET NAMES" мне так не повезло и до текущего момента я не знал какие запросы он в себе скрывает. В итоге, документация говорит про три таких запроса:
    1. SET character_set_client = utf8;
    2. SET character_set_connection = utf8;
    3. SET character_set_results = utf8;

    И вновь мы видим запросы на изменение тех же опций, которые мало того, что содержатся в "SET CHARACTER SET", так ещё и впоследствии изменяются отдельными запросами с "utf8" на "cp1251".

    Иными словами, таким вот "решением проблемы с кодировкой", которое дано в теме, Вы каждый раз будете "дёргать" одни и те же опции, изменяя их значение с одного на другое.




    На этой ноте можно было бы закончить, но мне стало интересно окончательно закрыть тему кодировки для SA-MP. И я был бы не я, если бы не поделился найденной информацией с Вами :) Заодно, если я вдруг ошибусь, кто-то сможет меня поправить.

    Маленькая оговорка касаемо определений:
    Сервер - это наш сервер MySQL с базами дарных, блекджеком и всем остальным.
    Клиент - это, в нашем случае, сервер SA-MP
    Так же стоит понимать, что все опции настраивают именно сервер MySQL. Даже опция, связанная с кодировкой запросов от клиента, влияет именно на сервер, так как именно он будет заниматься конвертированием данных. То бишь, уяснили: все операции с данными происходят не на стороне сервера SA-MP или плагина, а именно на стороне сервера MySQL. И всеми опциями мы лишь сообщаем серверу MySQL нужную информацию для того, чтоб он совершил конвертирование.



    Давайте разберёмся с основными опциями, которые нам могут пригодится. В случае с SA-MP нам потребуется всего несколько, так как остальные MySQL либо самостоятельно подстроит под эти запросы, либо они уже настроены как надо по умолчанию.

    • character_set_client - В этой опции указaывается кодировка, в которой будут поступать данные от клиента к серверу.
    • character_set_results - В этой опции указывается кодировка, в которую сервер конвертирует данные перед отправкой их клиенту.
    • character_set_connection - В этой опции указывается кодировка, в которую сервер перекодирует данные, полученные от клиента, перед тем, как начнёт выполнять запрос (клиент->character_set_connection->сервер)


    Собственно, всё. Опция collation_connection, которую предлагает настроить $continue$, для каждой кодировки имеет установку по умолчанию, которая, в случае с utf8, будет равна как раз "utf8_general_ci", поэтому определять её самостоятельно нет смысла.
      Открыть/закрыть
    Если кому интересно, посмотреть "настройки по умолчанию" для той или иной кодировки можно при помощи запроса
    PHP код:
    SHOW COLLATION WHERE charset 'имя_кодировки'
    Результатом запроса будет список всех доступных вариантов представления для указанной кодировке и напротив того представления, которая является представлением по умолчанию, в столбце "Default" будет стоять "Yes".

    Вот пример результата для utf8
    PHP код:
    SHOW COLLATION WHERE charset 'utf8' 






    Теперь осталось действительно решить все проблемы с кодировкой, дабы всё работало как надо.
    В чём заключается проблема? В том, что сервер не знает в какой кодировке работает клиент, из-за чего не может правильно конвертировать данные, пришедшие от клиента и подготовить данные к отправке для клиента. И если Вы взгляните на те 3 опции, что я перечислил выше, то найдёте решение всем проблемам.
    Я не зря расписал то, в чём заключается проблема, ибо если Вы сейчас перечитаете составленное мной определение, то увидите, что в обоих случаях фигурирует именно клиент. А с какой кодировкой работает наш клиент? Правильно, cp1251. Поэтому все те свистопляски с 'utf8', которые устроил $continue$ в своём варианте, бессмысленны (можно разве что в character_set_server передавать "utf8", если Вы не уверены в том, что сервер MySQL изначально настроен под эту кодировку).


    Этих двух запросов должно целиком и полностью хватить для хранения русского текста в базе (с учётом того, что Вы никак не правили остальные настройки кодировки и они выставлены по умолчанию или же настроены правильно):
    1. mysql_query(var_connection, "SET character_set_client = 'cp1251'", false);// Определяем кодировку для запросов от сервера SA-MP к базе
    2. mysql_query(var_connection, "SET character_set_results = 'cp1251'", false);// Определяем кодировку от базы данных к нашему серверу SA-MP

    Как минимум, вся та каша из запросов, что даёт $continue$, точно не нужна.

     Опциональные запросы:
    1. mysql_query(var_connection, "SET SESSION character_set_server='utf8'", false);// Устанавливаем кодировку, в которой данные будут хранится на сервере MySQL (кодировка самого сервера, иными словами)


    P.S. Всё это подкреплено лишь моим маленьким "расследованием" (копанием документации) и простыми тестами на локальном сервере с дефолтными настройками MySQL, так что было бы неплохо проверить все мои доводы в более разных условиях, дабы уже окончательно отшлифовать код, если вдруг я чего-то не учёл.
    Засим я откланиваюсь Надеюсь, что у меня получилось понятно объяснить Вам назначение перечисленных опций. Спасибо за внимание
    Ничего не трогая, не настраивая сервер у меня все равно не работали русские символы. В том методе, что давал я - все работало. Не знаю с чем это связано, наверное где-то подкрутить настройки mysql сервера нужно.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

  9. #38
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    Ничего не трогая, не настраивая сервер у меня все равно не работали русские символы. В том методе, что давал я - все работало. Не знаю с чем это связано, наверное где-то подкрутить настройки mysql сервера нужно.
    Ты можешь сам нагуглить описание всех запросов и посмотреть как они воспринимаются БД :) От того, что ты по несколько раз одни и те же опции перезапишешь, БД лучше работать точно не станет.

    У тебя проблема могла быть в том, что ты сначала записал текст в кривой кодировке, после уже этими запросами настроил кодировку правильно, но данные остались в кривой кодировке и БД, пытаясь их конвертировать из utf8 в cp1251, естественно выдавала бы кашу.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #39
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    У тебя проблема могла быть в том, что ты сначала записал текст в кривой кодировке
    Точно нет. Данные записываются динамично. (оффлайн сообщения). Т.е создаются прямо сейчас.

    UPD: Видимо последний раз, когда проверял твое решение, не использовал доп.запрос. Сейчас проверил, все работает :)
    Последний раз редактировалось $continue$; 03.06.2021 в 17:05.
    Value your freedom or you will lose it, teaches history. "Don't bother us with politics," respond those who don't want to learn. (c) Richard Stallman

 

 
Страница 4 из 4 ПерваяПервая ... 2 3 4

Информация о теме

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

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •