Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > mysql + utf


Автор: od0201 10.5.2011, 12:06
всем доброе время суток.

открываю gmail, беру оттуда текст и вставляю в MySQL (поле utf8_general_ci), прогоняя текст через $dbh->quote()

и как не странно все работает.

Нооооооооооо...со временем заметил, что иногда не весь текст ложится корректно, а именно, когда в тексте присутствует умляут или что-то ему подобное (письма иностранцы пишут), весь текст начиная с этого символа пропадает.

вставка вручную прямо в таблицу нормально сохраняет этот же текст.
вывод текста в файл также корректен.

Прокомментируйте, пожалуйста, мой случай. Заранее благодарен

Автор: Pfailed 10.5.2011, 12:43
А что-нибудь типа $dbh->query("set names utf-8") делаете?

Автор: od0201 10.5.2011, 14:05
было

Код

use DBI;
$dbh = DBI->connect("dbi:mysql:database=$DATA{'DB'};host=$DATA{'HOST'};port=3306", $DATA{'LOGIN'}, $DATA{'PASSW'}) or die "Couldnot connect to MySQL: $DBI::errstr\n";
$dbh->do("set names utf8");
...
$dbh->do('UPDATE lm_in SET letter='.$dbh->quote($gm_letter) WHERE id='.$gm_id.' LIMIT 1');


попробовал убрать 
$dbh->do("set names utf8");
текст не пропадает, но русские буквы превратились в ????
поигрался немного и следующая комбинация привела к ожидаемому результату.

Код

use DBI;
$dbh = DBI->connect("dbi:mysql:database=$DATA{'DB'};host=$DATA{'HOST'};port=3306", $DATA{'LOGIN'}, $DATA{'PASSW'}) or die "Couldnot connect to MySQL: $DBI::errstr\n";
$dbh->do("set names utf8");
...
$dbh->do("set names CP1250");
$dbh->do('UPDATE lm_in SET letter='.$dbh->quote($gm_letter) WHERE id='.$gm_id.' LIMIT 1');
$dbh->do("set names utf8");


пока все работает, всем спасибо

Автор: od0201 10.5.2011, 16:12
НЕТ !!! потестил, вариант с
$dbh->do("set names CP1250");
не устраивает
русские буквы выводит как 
Ďđč˙ňíîăî ňĺáĺ äí˙. 

$dbh->do("set names CP1251");
умляуды коверкает

$dbh->do("set names utf8");
все что не из латинского алфавита и все что идет после этого символа - удаляет


пока остановился на таком варианте (когда текст пропадает), ищу выход, если есть идее, прокомментируйте 

Код

CREATE TABLE IF NOT EXISTS `lm_in` (
...
  `id` int(7) NOT NULL,
  `letter` text CHARACTER SET utf8 NOT NULL,
...
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



Код

use utf8;
use DBI;
$dbh = DBI->connect("dbi:mysql:database=$DATA{'DB'};host=$DATA{'HOST'};port=3306", $DATA{'LOGIN'}, $DATA{'PASSW'}) or die "Couldnot connect to MySQL: $DBI::errstr\n";
$dbh->do("set character set utf8");
$dbh->do("set names utf8");
...
$dbh->do('UPDATE lm_in SET letter='.$dbh->quote($gm_letter) .' WHERE id='.$gm_id.' LIMIT 1');

Автор: arto 10.5.2011, 16:27
perldoc DBD::mysql на предмет mysql_enable_utf8

Автор: od0201 10.5.2011, 23:28
$dbh->{'mysql_enable_utf8'} = 1;

проблему не решает, скорее всего загвоздка в кодировке самого gmail. 
gmail сам не корректно  работает с умляудами (или браузер тупит) и я думаю выставляет кодировку в зависимомти от региона пользователя

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)