Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировка в mysql  (Прочитано 19997 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« : 05-02-2007 06:33 » 

Так сказать моё освоение perl+sql прродолжается.
вот возникла проблема с выводом русских символов.

сождел в mysql таблицу, там написал по-русски. при попытке вывести эту строку поплучаю строку из символов "?".

как с этим бороться?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-02-2007 06:49 » 

CAHTA_, подумай о кодировках. Perl тут не при чем.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 05-02-2007 07:01 » 

в шеле тоже выводится ахинея с "?"
в браузре испробовал все доступные кодировки...
Записан
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 05-02-2007 09:19 » 

что делать то? в шеле локаль на koi8-r. но смено ахинея выводится в шеле... ввиде "?"
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 05-02-2007 10:34 » 

Не помню точно, но помоему MySQL все текстовые данные по умолчанию хранит в кодеровке UTF-8.
Если это так то тебе надо либо переназначить кодеровку для хранения тексовых данных, либо ручками делать перекодеровку.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 05-02-2007 10:40 » 

Во-первых, стоит выяснить, кодировку исходного материала, занесенного в базу и какие манипуляции выполнила программа, занесшая сие.
Во-вторых, посмотреть версию базы - линейка 5.х поддерживает управление кодировками на уровне баз, таблиц и столбцов.
Ну и наконец, дефолтная настройка для клиента (см. в конфиге).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-02-2007 14:16 » 

версия mysql 4.1.22

вот сама таблица.
Код:
CREATE TABLE fg_t
(
   foto_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (foto_id),
   f_name VARCHAR(100) NOT NULL,
   f_w_h VARCHAR(11) NULL,
   f_s VARCHAR(6) NULL,
   fgroup VARCHAR(50) NULL,
   mcomm VARCHAR(150) NULL,
   ucomm VARCHAR(20) NULL
);

вот перл код. с помошью которого я бытаюсь получить строку, расположенную в mcomm
Код:
#! /usr/bin/perl -w
print "content-type: text/html \n\n";

use strict;
use DBI;
use lib qw(/usr/local/apache/lib/perl);
use CGI qw(:standard);

my ($dbh, $sth);
$dbh = DBI->connect (
                      "DBI:mysql:host=***;database=***",
                      "***",
      "***",
      {PrintError=>0, RaiseError=>1}
    );
$sth = $dbh -> prepare("SELECT mcomm FROM fg_t WHERE foto_id = 19");
$sth -> execute();

my @val = $sth->fetchrow_array();

print $val[0];

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

должно выдавать строку "Чечня, Грозный, гостиница "Советская". Ожесточенный бой", а выдает строку
"Не понял??, Не понялНе понял?, Не понялНе понялНе понял "Не понялНе понялНе понял". Не понялНе понялНе понялНе понял Не понял"  =(

пытаясь исправить положение, войдя в  mysql,ввел команду set CHARACTER SET cp1251. но не помогло =(

P.S. смайл Не понял = 3х "?"
« Последнее редактирование: 05-02-2007 14:20 от CAHTA_ » Записан
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 05-02-2007 14:19 » 

и еше...

Код:
mysql> INSERT INTO fg_t VALUES('','I_oo11.jpg','600*917','291','b_fotik','','');
Query OK, 1 row affected, 1 warning (0.00 sec)

почему предупреждение то?
« Последнее редактирование: 15-12-2007 21:55 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 05-02-2007 14:43 » 

Выполни скрипт в консоле.

Про источник данных ты ничего не написал!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #9 : 12-09-2008 11:42 » 

Ситуация аналогичная. При создании базы данных указывал опцию:  CHARACTER SET cp1251. Создал файл с данными для одной из таблиц базы в кодировке cp1251. Добавляю его в таблицу с помощью LOAD DATA INFILE.... В терминале смотрю таблицу:
Код:
SELECT * FROM makers;
- получаю имена мейкеров в виде
Код:
????.?.
Думаю, может терминал не понимает. Посмотрел в Настройка->Кодировка стоит cp1251. Очистил таблицу, затем установил кодировку для конкретной таблицы:
Код:
ALTER TABLE makers CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
Опять добавил записи в таблицу - ничего не изменилось. Опять одни знаки вопроса,  вместо букв! Как же все-таки сделать правильно?
Записан
andrystepa
Помогающий

ru
Offline Offline

« Ответ #10 : 12-09-2008 12:07 » 

Прошу прощения, нашел в чем дело! Просто в клиенте надо было указать кодировку:
Код:
mysql>SET NAMES 'cp1251'
и всего-то!!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 12-09-2008 14:21 » 

andrystepa, для начала: какая версия mysql-сервера?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #12 : 25-09-2008 07:24 » 

RXL,
andrystepa, для начала: какая версия mysql-сервера?

Версия сервера mysql-server-5.0.45-6.fc8.i386. Команда
Код:
mysql>SET NAMES 'cp1251'
к сожалению помогает только до перезагрузки. Команды
Код:
SET GLOBAL character_set_client='cp1251';

SET GLOBAL character_set_results='cp1251';

SET GLOBAL character_set_connection='cp1251';
вообще не помогают. К тому же эта команда выправляет отображение символов только в консоли. В любом веб-браузере все равно выдаются одни знаки вопроса! По команде SHOW VARIABLES про кодировки пишется такое:
Код:
character_set_client            | cp1251                                                  |
| character_set_connection        | cp1251                                                  |
| character_set_database          | cp1251                                                  |
| character_set_filesystem        | binary                                                  |
| character_set_results           | cp1251                                                  |
| character_set_server            | latin1                                                  |
| character_set_system            | utf8                                                    |
Это после команды SET NAMES ...
« Последнее редактирование: 25-09-2008 07:26 от andrystepa » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 25-09-2008 18:21 » 

andrystepa, SET NAMES не до перезагрузки работает - это влияет только на одну сессию (в которой выполняется) и только на время сессии.

А с кодировками у тебя ужас какой-то...

Давай будем примерами оперировать. Вот такая настройка (в конфиге, блок mysqld)

Код:
character-set-client-handshake
character-set-filesystem = utf8
character-set-server = utf8
default-character-set = utf8

дает

Код:
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | utf8                       |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

При подключении я указываю либо --default-character-set=utf8 (когда работаю консольным mysql-клиентом или бекаплю утилитой mysqldump), либо выполняю SET NAMES utf8 (в случае других программ). Это дает такой эффект:

Код:
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Где character_set_database зависит от DEFAULT CHARACTER SET при создании или модификации базы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #14 : 26-09-2008 12:06 » 

RXL,  С кодировками действительно ужас. А все потому, что мне надо чтобы данные в базе хранились на русском языке, причем изменяться и обновляться они будут через веб интерфейс (написанный на php) из Виндовых веб браузеров (чаще всего это Internet Explorer). Я предположил  что в этом случае удобнее использовать кодировку win1251, поэтому базу данных создал с DEFAULT CHARACTER SET win1251. А в my.cfg, в секции [mysqld], впрочем, как и в других секциях, никаких упоминаний о кодировке нет - то есть все по дефаулту. Поэтому я никак не могу определить, что же туда следует написать в моем случае (локаль у меня utf8). Данные в базу записывал в кодировке win1251. И веб-интерфейс пишу в этой же кодировке.
Записан
Paymer-Soft
Новенький

ua
Offline Offline

« Ответ #15 : 08-12-2013 03:06 » 

После старта сессии MySQL нужно выполнять команду SET NAMES 'cp1251';
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 08-12-2013 07:28 » 

После старта сессии MySQL нужно выполнять команду SET NAMES 'cp1251';

Зачем откапывать тему и дублировать информацию?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

"железокаменный метеорит" мог образоваться от расплавления металлических конструкций в результате например ядерного взрыва и стекания жидкого железа в какой нибудь щебень (c) Иванов С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines