mysql dbase_name < filename.txt - проблема с utf-8

Pilsen

Новичок
mysql dbase_name < filename.txt - проблема с utf-8

freebsd 6, mysql 5.1.30

возникла проблема при запихивании данных в базу

есть файл вида

call words_insert ( int , varchar1 [в utf], varchar2 [в utf]);
call words_insert ( int , varchar1 [в utf], varchar2 [в utf]);
call words_insert ( int , varchar1 [в utf], varchar2 [в utf]);
call words_insert ( int , varchar1 [в utf], varchar2 [в utf]);


этот файл я скармливаю мускулу командой

mysql dbase_name < filename.txt


процедура words_insert выполняет нехитрые операции, но в базу данные (всё, кроме латиницы) попадают в виде знаков вопроса ('?????????').

при этом, set names=utf8 стоит в my.cnf и никогда проблем таких не возникало.
так же set names=utf8 поставил в начало хранимой процедуры.
уже даже использовал --default-character-set=utf8 в самой команде

mysql --default-character-set=utf8 db_name < filename.txt


подскажите, как решить проблему? какие могут быть варианты?
 

Gas

может по одной?
Я бы добавил в самом файле (вначале) set names utf8;
 

Gas

может по одной?
может глаз "замылился", точно данные в файле в utf8? и точно ли в базе знаки вопроса, может просто при просмотре не стоит utf8 ?
 

Pilsen

Новичок
к несчастью - данные в utf.

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

первый файл: запросы insert, данные тоже в utf8. С ними всё ок, они попадают в базу и отображаются нормально как для латиницы, так и для корейского, японского и китайского языков.

а второй файл, создаваемый теми же скриптами, это вызовы хранимых процедур вида
call words_insert (utf data)

и вот они попадают в базу знаками вопроса.
так что, очевидно, проблемы где-то в процедурах.

я на mysql.com видел подобные вопросы, датируемые еще 2005м годом, но ответов так и не нашел.

очень сомневаюсь, что в хранимые процедуры нельзя передавать utf-8 строки.

просто я, наверно, делаю это как-то неправильно :(
 

Фанат

oncle terrible
Команда форума
нельзя говорить "данны епопадают виде знаков вопроса". Надо говорить "когда я просматриваю, то виду их вопросами"
а таблица то создана в какой кодировке?
 

Pilsen

Новичок
utf8_general_ci,

я повторю:
данные именно "попадают" в базу в виде знаков вопроса.
потому как данные из соседнего файла в той же кодировке я "просматриваю" в правильном виде.
 

Фанат

oncle terrible
Команда форума
utf8_general_ci - это не кодировка.
и я бы предпочел посмотреть своими глазами, а не в пересказе
"потому как просматриваю" ни о чем не говорит совершенно.
 

Pilsen

Новичок
ок, вы правы, это collation. таблица в утф8

CREATE TABLE IF NOT EXISTS `keywords` (
`kid` int(12) unsigned NOT NULL AUTO_INCREMENT,
`keyword` varchar(32) NOT NULL,
`amount` int(8) unsigned NOT NULL DEFAULT '1',
`lang` char(8) NOT NULL,
PRIMARY KEY (`kid`),
UNIQUE KEY `index_keyword` (`keyword`,`lang`) USING BTREE,
KEY `index_lang` (`lang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

phpmyadmin показывает напротив поля keyword и поля lang стоит utf8_general_ci.

вот как выглядят данные (лишь в этой таблице):
kid keyword amount lang
Edit Delete 1 ?????? 1 zh-CN
Edit Delete 3 ???? 1 zh-CN
Edit Delete 9 ?? 1 zh-CN
 

Фанат

oncle terrible
Команда форума
да, в таком случае именно вставляются, а не показываются. поскольку из утф вопросов не бывает.

а если этот запрос из файла выполнять в консоли?
 

Pilsen

Новичок
непосредственно из консоли не получается, так как при копировании из буфера юникод превращается в точки.

я пытался сделать из консоли загрузку запросов из файла

синтаксис там "mysql> source filename;"

результат тот же - знаки вопроса :(

проблема где-то с хранимыми процедурами. без них данные успешно попадают в базу. а без них мне сложно, так как данных в конце концов будет порядка 100 миллионов строк.
 

Фанат

oncle terrible
Команда форума
странная консоль какая.
в определении процедур нигде кодировка не указывается, как для таблиц? кодировка параметров, возвращаемых значений?
 

Pilsen

Новичок
разобрался :)

как раз при определении процедуры указал charset и всё "заработало"

PROCEDURE insert_keywords(vID INT(12), vKEYWORD VARCHAR(32) CHARSET UTF8, vLANG VARCHAR(12) CHARSET UTF8)

почему-то был уверен, что должно хватить
SET NAMES 'utf8' COLLATE 'utf8_general_ci';
в начале процедуры.

спасибо всем за участие.

-~{}~ 09.12.09 16:03:

вот тут пример нашел
http://bugs.mysql.com/bug.php?id=24690

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