Forum Webscript.Ru

Программирование => Perl => Тема начата: Nikolai Z. от 15 Февраля 2006, 10:08:03

Название: MySQL + CGI perl проблема с русским
Отправлено: Nikolai Z. от 15 Февраля 2006, 10:08:03
Доброго времени суток....

Вот проблемка возникла, поставил я на Win2k, Perl + MySQL 5.
До этого я MySQL никогда сам не ставил... использовал хостинговые.

И наткнулся на проблему... Когда я добавляю запись в таблицу.... русские символы превращаются в ???? знаки вопросов.

Пробовал менять кодировку как самого сервака, так и БД, так и таблцы, и даже отдельного поля....

Вот подумал а может дело не в MySQL а в перле или еще в чем?
Название: MySQL + CGI perl проблема с русским
Отправлено: AnnA от 15 Февраля 2006, 11:40:38
по умолчанию установлена страница latin1 и текст хранится в кодировке utf8 отсюда и ваши проблемы.
страницу можно исправить в файле конфигурации бд - my.ini
в скрипте можно делать так:
if ($dbh) {
     $dbh->do("use $db_name") or die $DBI::errstr;
     $dbh->do(\'SET CHARACTER SET cp1251\') or die $DBI::errstr;
     $dbh->do(\'SET NAMES cp1251\') or die $DBI::errstr;
}
Название: MySQL + CGI perl проблема с русским
Отправлено: AnnA от 15 Февраля 2006, 11:45:18
а. и еще, если вы поставили себе 4-ю версию бд, - таблицы можно открывать так:CREATE TABLE `example` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
......,
  PRIMARY KEY(`id`)
)
ENGINE = MYISAM
CHARACTER SET cp1251 COLLATE cp1251_general_ci;

;)
Название: MySQL + CGI perl проблема с русским
Отправлено: Nikolai Z. от 15 Февраля 2006, 17:17:14
AnnA
непомогло =(
Может в скрипте что не так?

Чуток попозже я кину как БД выглядит и скрипт
Название: MySQL + CGI perl проблема с русским
Отправлено: Nikolai Z. от 15 Февраля 2006, 17:36:36
SQL:
CREATE TABLE `users` (
`name` VARCHAR( 100 ) ,
PRIMARY KEY ( `name` )
) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_general_ci;


INSERT INTO `users` ( `name` ) VALUES (\'Вася Пупкин\');
INSERT INTO `users` ( `name` ) VALUES (\'Vasia Pupkin\');

PERL:

#!/usr/bin/perl -w

use strict;
use DBI;
use CGI;

my $CGI = new CGI;

my $dbh = DBI->connect("DBI:mysql:test:localhost","test","test", {RaiseError => 1, PrintError => 0});

my $sth = $dbh->prepare("SELECT name FROM users");
   $sth->execute();
 
print $CGI->header();
   
while(my $text = $sth->fetchrow_array()) {
 print $text."
";
}

$sth->finish();
$dbh->disconnect();


Результат:
Vasia Pupkin
???? ??????


Результт на хостинге:
Vasia Pupkin
Вася Пупкин
Название: MySQL + CGI perl проблема с русским
Отправлено: AnnA от 15 Февраля 2006, 18:51:07
а локально (не на хостинге), помимо:
print $CGI->header(-charset=>\'windows-1251\');
еще и то, что я уже писала
Цитировать
AnnA:
if ($dbh) { $dbh->do("use $db_name") or die $DBI::errstr; $dbh->do(\'SET CHARACTER SET cp1251\') or die $DBI::errstr; $dbh->do(\'SET NAMES cp1251\') or die $DBI::errstr; }
Название: MySQL + CGI perl проблема с русским
Отправлено: Nikolai Z. от 15 Февраля 2006, 19:01:16
AnnA
Супер!!! СпасибО большое!

#!/usr/bin/perl -w

use strict;
use DBI;
use CGI;

my $CGI = new CGI;

my $dbh = DBI->connect("DBI:mysql:test:localhost","test","test", {RaiseError => 1, PrintError => 0});
 
$dbh->do(\'SET CHARACTER SET cp1251\');

my $sth = $dbh->prepare("SELECT name FROM users");
   $sth->execute();

print $CGI->header(-charset=>\'windows-1251\');
   
while(my $text = $sth->fetchrow_array()) {
print $text."
";
}

$sth->finish();
$dbh->disconnect();

Вот так работает!
Правда я не допру немного, почему на ххостингах эта строка вообще нефиг не нужна... а на локальном приходится вот такой лишний запрос в БД делать?

Ну ладно... перед тем как в нет выкладывать мона эту строку будет закомментировать.

А что лучше использовать?
$dbh->do(\'SET CHARACTER SET cp1251\');
или
$dbh->do(\'SET NAMES cp1251\');

вдвоем их можно и не указывать... с 1 все работает....
Название: MySQL + CGI perl проблема с русским
Отправлено: Angel от 18 Марта 2006, 19:14:28
Продолжаю тему:

Некоторые юзеры оставляют в базе вместо нормального текста кириллицей - кракозяблики. Методом научного тыка подобрал кодировку, при которой их кракозяблики становились читабельными - UTF-8. Вся страничка и все данные - в CP-1251.

Как решить данную проблему?
Название: MySQL + CGI perl проблема с русским
Отправлено: ondr от 18 Марта 2006, 22:16:02
Angel
обоснуй проблему