Вход

Просмотр полной версии : Записи в БД на русском языке


9xakep
01.05.2012, 14:51
Как сделать записи в БД на русском, что нужно сделать, где какие кодировки, уже часа 2 хожу по сайтам, в слепую тыкаю, но ничего не выходит:
http://s019.radikal.ru/i633/1205/3d/1f9f0e34f517.jpg
http://s019.radikal.ru/i604/1205/fe/0bc0691902fe.png
http://s018.radikal.ru/i505/1205/6d/a5ebc0070086.png

9xakep
01.05.2012, 15:20
Нашел решение, думаю многим понадобиться:

$con = mysql_connect('localhost', 'gmoryes_login', '*****'); // Подсоединяемся к БД
if(mysql_select_db('gmoryes_login', $con))
{
// в самом начале прописываем это:
mysql_query("SET CHARACTER SET cp1251")or die(mysql_error());
mysql_query("SET NAMES cp1251")or die(mysql_error());
mysql_query ("SET character_set_client='cp1251'");
mysql_query ("SET character_set_results='cp1251'");
mysql_query ("SET collation_connection='cp1251_general_ci'");

Gvozd
01.05.2012, 15:53
Нашел решение, думаю многим понадобиться:
на скриншоте выше вы используете сравнение utf8_general_ci, а в коде используете кодировку cp1251
Такое решение будет работать не совсем корректно.
Использовать стоит сравнение из семейства соответсвующих используемой кодировке

И учитывая, что вы используете кодировку cp1251, то вы не сможете использовать символы не из латиницы и кириллицы
В вашем случае более странным, чем использование кириллицы для пароля, может показать использование только кириллицы и латиницы в пароле

9xakep
01.05.2012, 17:17
Gvozd,
насколько я понял, ты хочешь сказать, что я не смогу использовать латиницу?
http://s019.radikal.ru/i613/1205/2a/ec43c8d60e8f.png
Да и это пока тупость, согласен, я просто хочу сделать чат, вот и задумался, как буду сообщения сохранять, и не стал создавать что-то новое, сделал все на странице регистрации, естественно потом все номрмально сделаю
P.S. не ты писал выше? 102-106 записи

Gvozd
01.05.2012, 17:57
насколько я понял, ты хочешь сказать, что я не смогу использовать латиницу?
нет, я такого не говорил.
я сказал, что вы не сможете использовать ничего кроме кириллицы и латиницы
Например написать пароль на немецком или иврите
P.S. не ты писал выше? 102-106 записи
я даже не знаю где находится сайт для которого ты это делаешь
хотя сейчас начал догадываться что речь о твоем проекте в подписи

9xakep
01.05.2012, 18:04
Gvozd,
пароль на иврите :blink:
=====
Cейчас поменял кодировку на ср1251, но немецкий все также не читается, или я опять тебя не так понял :write:
=====
хотя сейчас начал догадываться что речь о твоем проекте в подписи
да о нем, сейчас делаю возможность добавления аватарок)

Gvozd
01.05.2012, 18:08
пароль на иврите
чем пароль на иврите хуже пароля на русском?
Cейчас поменял кодировку на ср1251, но немецкий все также не читается, или я опять тебя не так понял
и не должен.
Если ты задаешь кодировку CP1251, то значит тебе доступны символы только из русского языка и латиницы.
немецкий язык, благодаря умляутам не может быть записан в этой кодировке

9xakep
01.05.2012, 18:12
Gvozd,
просто в жизни бы не догадался использовать пароль на иврите...тогда уж на китайском или японском лучше...правда без инета его не наберешь, если конечно не носить с собой его, чтобы скопировать
======
1) Не легче на js создать ограничения?
2) Как в случае чего добавить поддержку всех языков? Мне для сообщений понадобиться

Gvozd
01.05.2012, 18:23
в жизни бы не догадался использовать пароль на иврите...
Но ведь на русском догадались)
Намекаю: пароль на любом национальном шрифте - глупость по определению. Но если уж и разрешать какой-нибудь из национальных шрифтов, то разрешать все языки.
1) Не легче на js создать ограничения?
у вас уже на уровне базы стоит ограничение
я говорю не о том, что вам нужно ввести проверку или поставить ограничение, а о том, что вы уже ввели весьма странное ограничение, выбрав кодировку cp1251 для пароля
Как в случае чего добавить поддержку всех языков? Мне для сообщений понадобиться
Выбрать кодировку UTF8, и одно из сравнений из семейства utf8_*, например utf8_general_ci
Если выберете однобайтовую кодировку, то поддерживать она будет только ограниченный список языков
Если выберете неправильное сравнение, то у вас будет неправильно работать выборка с сортировкой
PS кодировка и сравнение -разные вещи. в гугле об этом можно прочитать, если что

9xakep
01.05.2012, 18:30
Но ведь на русском догадались)
Да и это пока тупость, согласен, я просто хочу сделать чат, вот и задумался, как буду сообщения сохранять, и не стал создавать что-то новое, сделал все на странице регистрации, естественно потом все номрмально сделаю
Выбрать кодировку UTF8
:D :D !pokerface! Я полдня просидел с utf-8, и это не смешно, и на ней не работал русский язык..были кракозябы

Gvozd
01.05.2012, 18:49
Сообщение от гозар
Это форум так глючит, или вы специально мои цитаты переписываете на чужое имя?)
!pokerface! Я полдня просидел с utf-8, и это не смешно, и на ней не работал русский язык..были кракозябы
значит что-то вы делали неправильно
например, возможно исходные данные, помещаемые в БД были в неверной кодировке
Учитывая, что вы додумались страницу регистрации создать в CP1251, то данные присланные из браузера не могли бы быть обработанными в иной кодировке, если вы их конечно не перевели в нормальную кодировку. А вы наверняка не перевели, иначе проблема бы не было.

Итак, что нужно сделать:
везде использовать UTF-8
страница с формой регистрации должна быть в UTF-8, а не CP1251, как щаз
для этой страницы должны быть указаны HTTP-заголовки, указывающие кодировку, и соответствующий META_тег. кодировка - UTF-8
скрипт принимающий данные, также в UTF-8
И база также, в UTF-8

9xakep
01.05.2012, 18:56
Gvozd,
Это форум так глючит, или вы специально мои цитаты переписываете на чужое имя?)
сори, это я ваши логины вечно путаю)
=======
ок, спасибо, попробую

Gvozd
01.05.2012, 19:04
сори, это я ваши логины вечно путаю)
а зачем вы логины переписываете?
форум их прекрасно подставляет в сообщение, когда вы его выделяете(в хроме так точно)
даже если вам движок форума не подставил логин, то зачем его дописывать?

9xakep
01.05.2012, 19:31
Gvozd,
просто цитату сделал посредством bb кодов, имена сам решил дописать, если тебя как-то обидело извини :/

Gvozd
01.05.2012, 20:01
если тебя как-то обидело извини
да не, ниче страшного

jsuse
17.05.2012, 21:27
Выбрать кодировку UTF8, и одно из сравнений из семейства utf8_*, например utf8_general_ci


Чтобы не создавать новую тему, спрошу здесь.

Скажите, вот phpmyadmin предлагает более 10 видов кодировок utf-8. Только 3 из них кажутся нейтральными: utf8_general, utf8_unicode и utf8_bin. Какую одну из них следует использовать?

Gvozd
17.05.2012, 22:25
jsuse,
Это о предлагает не кодировки, а сравнения
сравнение будет влиять на то, в каком порядке выводить записи, если вы отсортируете их по текстовому полю.
а кодировка во всех случаях - одна и та же - Utf8
Если нету какой-то специфики, то берите utf8_general_ci

B@rmaley.e><e
17.05.2012, 22:36
Пароль вообще хранить в БД не нужно.

Раед
17.05.2012, 22:40
Пароль вообще хранить в БД не нужно.

И где же его хранить? В защищённых файлах?

jsuse
17.05.2012, 22:59
jsuse,
Если нету какой-то специфики, то берите utf8_general_ci

Спасибо, так и сделал. Но что-то русский все равно не выводит. Уже слава богу не кракозябры, а только ?????? вопросительные знаки, но все равно не выводит.

У меня была windows-1251 везде. И на доктайпе html-страницы, и база данных (сама БД была windows-1251), каждая таблица БД w-1251 и каждая ячейка таблицы, где имелся текст, тоже w-1251. И текст на русском выводился из БД нормально.

Теперь перевел все на utf-8, и доктайп html-страниц, и базу данных, и таблицы в БД, и ячейки в таблицах (и charecter set и collation, все сделал utf-8_general_ci). Попересохранял все файлы через Блокнот, там есть опция "сохранить в utf-8". А все равно русский текст из БД не вытаскивает, превращает в ?????. Что еще может быть, не подскажите, что мог пропустить?

Но правда не все еще таблицы и ячейки поменял. Сменил только кодировку всей БД и одной из таблиц, из которой беру русскую инфу на вывод. Другие остались пока win-1251. Но они не связаны с измененной таблицей. Не думаю, что это может влиять.

Спасибо.

B@rmaley.e><e
17.05.2012, 23:02
И где же его хранить? В защищённых файлах?Не нужно его хранить вообще. Хранить нужно солёный хеш.

Gvozd
17.05.2012, 23:27
jsuse,
полагаю, вы изменили только сравнение, не изменив кодировку

http://www.lissyara.su/articles/freebsd/www/mysql_charsets/
Читать полностью, а особенно часть про "Что делать, если данные внесены в неправильной кодировке"

9xakep
18.05.2012, 15:49
Раед,
нет, его нужно схранить также, но в БД отправлять md5, при логине, хешируешь, то что ввел юзер, и сравниваешь, если хеши совпадают, то пароль правильный
http://s58.radikal.ru/i160/1205/d4/55ed99919b19.png

jsuse
20.05.2012, 22:11
jsuse,
http://www.lissyara.su/articles/freebsd/www/mysql_charsets/
Читать полностью, а особенно часть про "Что делать, если данные внесены в неправильной кодировке"

Gvozd, Хочу поблагодарить за ссылку. Ценнейшая статья. Я из одной этой статьи понял больше о кодировке, чем из всех книг и форумов, которые читал до этого. Разобрался, настроил, работает. Спасибо)

Интересно, что, если вызывать просмотр переменных кодировки в PhpMyAdmin и в командной строке, то результат разный. PhpMyAdmin показывает не верный, а командная строка верный. Это на всякий случай, если кому понадобится. Не доверять PhpMyAdmin, проверять в командной строке.

Вот, что показывает phpMyAdmin. По нему получается, что все правильно:

http://www.ljplus.ru/img4/a/_/a_ya_vishe/phpma.jpg


А на самом деле так:

http://www.ljplus.ru/img4/a/_/a_ya_vishe/cmd.jpg

Gvozd
20.05.2012, 22:55
Интересно, что, если вызывать просмотр переменных кодировки в PhpMyAdmin и в командной строке, то результат разный. PhpMyAdmin показывает не верный, а командная строка верный. Это на всякий случай, если кому понадобится. Не доверять PhpMyAdmin, проверять в командной строке.
Если не ошибаюсь эти настройки зависят пользователя
PMA у вас возможно запущен из-под root-а, а в командной строке вы работаете из обычного пользователя.
Попробуйте из командной строки зайти root-ом, либо в PMA в конфигах вбить логин-пароль другого пользователя, и картина изменится, надо полагать

Gozar
20.05.2012, 22:57
Не нужно его хранить вообще. Хранить нужно солёный хеш.
А собственно говоря почему?
Как предлагаете восстанавливать пароль? Отправлять на мыло сгенерированный, а потом чтобы юзер вбивал что хотел опять, тот же самый пароль?

Если кто-то кроме вас может получить доступ к вашей БД, то абсолютно без разницы хранить пароль или хэш.

9xakep
20.05.2012, 23:01
Gozar,
Почему это без разницы? Единственно что он сделает, так это вставит хеш пароль в куки, но на это легко защиту сделать, достаточно их каждый раз перезаписывать. Про забыл пароль, некоторые сайты делают так:

1) создают ссылку для создания нового пароля
2) добавляют новый пароль введенный юзером
А если хранить чистый пароль в БД, то при чужом попадании в нее, можно зайти в аккаунт другого юзера

B@rmaley.e><e
20.05.2012, 23:15
Отправлять на мыло сгенерированныйДа.Если кто-то кроме вас может получить доступ к вашей БД, то абсолютно без разницы хранить пароль или хэш.Нет, разница огромна. При правильном использовании хешей, конечно.

Gozar
21.05.2012, 00:06
Почему это без разницы?
Патамушта!

При правильном использовании хешей, конечно.
Это разговор ни о чём. Разницы нет.

Я даже могу выделить это красным:

Если кто-то кроме вас имеет доступ к таблице с паролями или хэшами, то вы уже удод (http://ru.wikipedia.org/wiki/%D0%A3%D0%B4%D0%BE%D0%B4) и поздно пить боржоми.

B@rmaley.e><e
21.05.2012, 00:34
Что-то не вижу красного.
И разница есть. Хотя бы в том, что юзеры любят использовать один пароль на многих сайтах.

Gozar
21.05.2012, 01:47
Что-то не вижу красного.
Тот кто не видит обычного и красного не увидит.

И разница есть. Хотя бы в том, что юзеры любят использовать один пароль на многих сайтах.
И какое это имеет отношение как хранить пароли в БД и к тому что посторонним не место в БД? Юзверы пусть делают что хотят, это их дело. Из сферической сферы обсуждение так и не вышло. Разницы нет.

Gvozd
21.05.2012, 02:16
Если кто-то кроме вас имеет доступ к таблице с паролями или хэшами, то вы уже удод и поздно пить боржоми.
пользователи использующие сложные пароли все еще будут защищены, даже при хищении базы с солеными хешами

B@rmaley.e><e
21.05.2012, 07:27
И какое это имеет отношение как хранить пароли в БД и к тому что посторонним не место в БД?Я где-то говорил про посторонних в БД?
Не вижу смысла в дальнейшем обсуждении, Вы всё равно не привели ни одного стоящего аргумента.

Aetae
21.05.2012, 08:24
Дело в том что навредить могут необязательно посторонние. Не читали историй про злобных и обиженных уволенных админов?)

Gozar
21.05.2012, 12:31
не привели ни одного стоящего аргумента.
Вы вообще не привели ни одного аргумента.

Не читали историй про злобных и обиженных уволенных админов?)
Нет, не читал.

B@rmaley.e><e
21.05.2012, 16:12
Вы вообще не привели ни одного аргумента.То, что Вы игнорируете мои посты, не означает, что я не привёл аргументы.юзеры любят использовать один пароль на многих сайтах

devote
21.05.2012, 16:17
Да хранить можно как угодно... главное перед регистрацией предупреждать надо пользователя о том что пароль будет виден администратору сайта и т.п. А там уж пользователь сам решит стоит свой вездешний вбивать или что-то новое придумать.. Вот этим меня вконтакт раздражает, тем что пароли хранит как есть, но не предупреждает об этом юзверей. Я лишь узнал об этом когда восстанавливал свой пароль, а они мне его обратно прислали как есть на мыло. То есть не новый сгенереный, а старый.

9xakep
21.05.2012, 16:40
Gozar,
аргументы:
1) Если зайдет кто-нибудь посторнний в БД, то сможет взять пароль юзера
2) Юзерам неприятно то чувство, что к их аккаунту есть доступ от администратора, хотя понимают, что читать он перписку чью-нибудь не будет
3) Зачем хранить в открытом виде вообще, если можно хранить в более защищенном?

Gozar
21.05.2012, 19:06
B@rmaley.e><e,
Это не аргумент, поэтому я и проигнорировал. Меня так же не интересует на какой стороне спит пользователь. Это его сугубо личное дело. У многих пароль написан на стикере приклееном в монитору.

Юзерам неприятно то чувство, что к их аккаунту есть доступ от администратора, хотя понимают
Ничего они не понимают и нужно всегда осознавать, что админ имеет доступ к твоей переписке. Там где начинаются деньги заканчиваются сопли про защищённость. Поэтому вконтакте плевать на то, как хранить пароли.

1) Если зайдет кто-нибудь посторнний в БД, то сможет взять пароль юзера
Эка невидаль, паролько не главное. Можно спокойно делать что угодно на сайте и без пароля юзверя, а имея доступ к БД вообще наплевать на пароли.

Развели тут демагогию про защищённость и секретность. Давайте без показушности. Хранение паролей имеет ряд преимуществ и недостатков.

Недостаток:
1. Можно получить доступ к многим аккаунтам одновременно, если нет дополнительной защиты. Это пожалуй самый серьезный недостаток.

Преимущество:
1. Не нужно морочить пользователю голову и заставлять его трахать себе мозг ссылками с новыми паролями. Это одно из самых серьезных преимуществ. Единицы не любят получать пароли и тысячи любят получать их, а не тратить время на процедуры "криворуких программистов", которые придумывают всемозможные "издевательства" для бедных пользователей.

Любое действо имеет ряд перимуществ и недостатков.

B@rmaley.e><e
21.05.2012, 20:49
доступ к БДДоступ к БД бывает разный. С помощью SQL-inj можно утянуть интересные данные, но очень редко удаётся изменить их.