Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > русские символы в таблице


Автор: del3d 4.3.2008, 00:26
всех приветствую..
Значит создаю таблицу..
Код

CREATE TABLE catalogs (
id_catalog int(11) NOT NULL auto_increment,
name varchar(20) NOT NULL,
PRIMARY KEY  (id_catalog)
) CHARSET=utf8;

Добавляю данные..
Код

INSERT INTO catalogs VALUES (1,'Процессоры');
INSERT INTO catalogs VALUES (2,'Материнские платы');

Но во второй столбец реально умещается только 10 русских символов.. английских символов помещается 20..
Работаю с клиентом командной строки mysql под Linux'ом..
Как же быть?

Автор: mishaSL 4.3.2008, 21:29
Это происходит т.к. каждый русский символ в utf-8 занимает 2 байта.

Автор: del3d 4.3.2008, 23:18
А можно, как-нибудь работать с английскими и русскими символами одинаково?
Пусть даже и английских символов помещается 10, но зато одинаково с русскими..

в вообще, как люди то делают, специально резервируют в два раза больше символов под русский алфавит? 
..типа varchar(40)?

Автор: smartov 5.3.2008, 00:04
Можно использовать http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html unicode-кодировку (ucs2) там все символы по 2 байта занимают (сохранение английских символов как одного байта это фича utf-8).
Или можно делать, как считается, неправильно, и использовать http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html. Например CP1251. Что, в принципе, не так страшно как его малюют и может быть вполне оправдано в каких-то случаях. Например, возможно, в твоем.

Хотя я на твоем месте просто увеличил бы размер полей varchar до 255 символов. Все равно "пустые" символы места занимать не будут. Чего ж экономить.

Автор: del3d 6.3.2008, 00:32
Спасибо за совет.. 

Автор: Fally 6.3.2008, 13:30
Цитата(smartov @  5.3.2008,  00:04 Найти цитируемый пост)
Хотя я на твоем месте просто увеличил бы размер полей varchar до 255 символов. Все равно "пустые" символы места занимать не будут. Чего ж экономить.

Из серии вредные советы? ;) Место то они занимать и не будут, НО если будет запрос на соединение по данному полю и VARCHAR(60) /к примеру 60/, то MySQL будет приводить VARCHAR(60) к VARCHAR(255), так как VARCHAR(n) != VARCHAR(m), где m != n. А это лишнее время.

Автор: smartov 6.3.2008, 13:43
Fally, нет. Совет из серии "как бы сделал я" и из серии "кто чем жертвует". Делать join по varchar это довольно редкая и странная операция. Более того время всегда тратится на все. И приведение 60 символов к 255 - не самое страшное.

А вот вы, собственно, что автору посоветовали? Вы пришли, поумничали по поводу моего поста, а путного автору не сказали ничего. ТАких критоков мы видели уже много раз.

Автор: Fally 6.3.2008, 13:48
На месте топик стартера я бы в первую очередь задался вопросом "А действительно ли мне нужен Юникод?" Очень часто ответ отрицательный. Тут исходя из задачи.

Автор: Feldmarschall 8.3.2008, 15:00
На месте всех отвечавших я бы задумался над вопросом "А действительно ли MySQL настолько тупо устроена, что не позоляет хранить указанное количество символов?".

На своем собственном месте я бы провел простой тест,
Код

mysql> set names cp1251;
Query OK, 0 rows affected (0.00 sec)

mysql> create table utf(f varchar(5)) charset=utf8;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into utf values ("кабан");
Query OK, 1 row affected (0.02 sec)

mysql> select * from utf;
+-------+
| f     |
+-------+
| кабан |
+-------+
1 row in set (0.00 sec)

и убедился, что ограниения для русского языка точно такие же, как и для любых других.

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

Автор: del3d 8.3.2008, 15:47
Код

set names cp1251;

ничего не изменило в поле опять не помещается 5 символов
Код

mysql> select * from a;
+-------+
| f     |
+-------+
| ка� |
| birds |
+-------+

А так как база данных будет создаваться в учебных целях на ПК с Linux (кодировка по умолчнию utf8), то исползование юникода, я думаю, оптимальный вариант..

Автор: Feldmarschall 8.3.2008, 15:53
Да при чем здесь set names!
Я не про set names писал. А привел пример того, что прекрасно русские буквы помещаются.

А тебе надо разбираться с настройками. Версия Mysql у тебя какая?

Кодировка OC к кодировке данных в бд и на сайте никакого отношения не имеет.
Но совет использовать однобайтную кодировку все равно неверный. Если есть кривизна с настройкой кодировки, то она вылезет и при однобайтной.
А проблема именно в насройке кодировок.

Автор: del3d 8.3.2008, 16:01
Код

mysql> select version();
+------------+
| version()  |
+------------+
| 5.0.45-Max |
+------------+

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

Добавлено через 8 минут и 4 секунды
Кстати, делаю все то же самое в MySQL Query Browser - все ОК, русские символы понимаются и заполняют все 5 позиций (при varchar(5)).
..но присоединяюсь к этой базе через клиент mysql, русские символы вообще не понимаются, но их 5 штук..
Код

mysql> select * from x;
+-------+
| x     |
+-------+
| ����� |
| ����� |
| ����� |
+-------+

при создании таблицы в Query Browser явно указывалась кодировка
Код

create table x(f varchar(5)) charset=utf8;

странные вещи..

Автор: Feldmarschall 8.3.2008, 16:20
Цитата(del3d @  4.3.2008,  00:26 Найти цитируемый пост)
Работаю с клиентом командной строки mysql под Linux'ом..

А кодировку, в которой ты работаешь, кто будет выставлять?
Получается, не utf8 у тебя в консоли по умолчанию!
И set names надо делать. Только не от балды, а с той кодировкой, которая у тебя в консоли.
А вскрипте - ту, которая будет на сайте. Сайт в какой будет кодировке?

Автор: del3d 8.3.2008, 16:39
отлично!!!
Код

set names utf8;
CREATE TABLE t1(a varchar(5)) CHARSET=utf8;
INSERT INTO t1 VALUES ("кабан");
INSERT INTO t1 VALUES ("hello");
SELECT * FROM t1;
+------------+
| a          |
+------------+
| кабан |
| hello      |
+------------+

а база учебная, не для сайта.. для нее максимум потом на Qt приложение напишется и теститься она будет в локальной сети из 13 одинаковых компов (о ОС openSUSE).
Спасибо Feldmarschall и всем остальным за помощь..

Добавлено через 14 минут и 45 секунд
Только вот все ровно напрягает деформация таблицы из-за русских букв
Код

insert into t2 values ("hello","World");
insert into t2 values ("хелло","Мир!");
mysql> select * from t2;
+------------+---------+
| a          | c       |
+------------+---------+
| hello      | World   |
| хелло | Мир! |
+------------+---------+

Автор: smartov 8.3.2008, 18:24
Feldmarschall, 
Цитата(Feldmarschall @  8.3.2008,  14:00 Найти цитируемый пост)
На месте всех отвечавших я бы задумался над вопросом "А действительно ли MySQL настолько тупо устроена, что не позоляет хранить указанное количество символов?".

Всем отвечающим в первую очередь было влом проверять.  smile От имени del3d (он то пока не может) за то что помог до конца ставлю +
p.s. В общем-то этот вопрос у меня появлялся, но как-то само собой подумалось - ведь автор то, наверное, ж проверил... smile

Добавлено через 1 минуту и 29 секунд
del3d, проблема решена? Если да - пометь тему как решенную

Автор: del3d 9.3.2008, 23:54
да, да все ок.. еще раз спаибо, закрвыаю тему!

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