Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> русские символы в таблице, один символ за два.. 
V
    Опции темы
del3d
Дата 4.3.2008, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



всех приветствую..
Значит создаю таблицу..
Код

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'ом..
Как же быть?
PM MAIL   Вверх
mishaSL
Дата 4.3.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 54



Это происходит т.к. каждый русский символ в utf-8 занимает 2 байта.


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
del3d
Дата 4.3.2008, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



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

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

PM MAIL   Вверх
smartov
Дата 5.3.2008, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



Можно использовать другую unicode-кодировку (ucs2) там все символы по 2 байта занимают (сохранение английских символов как одного байта это фича utf-8).
Или можно делать, как считается, неправильно, и использовать 8-битную кодировку. Например CP1251. Что, в принципе, не так страшно как его малюют и может быть вполне оправдано в каких-то случаях. Например, возможно, в твоем.

Хотя я на твоем месте просто увеличил бы размер полей varchar до 255 символов. Все равно "пустые" символы места занимать не будут. Чего ж экономить.
PM MAIL   Вверх
del3d
Дата 6.3.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Спасибо за совет.. 
PM MAIL   Вверх
Fally
Дата 6.3.2008, 13:30 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 17.8.2006
Где: Dahla

Репутация: нет
Всего: 4



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

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


--------------------
Прежде чем задать вопрос на форуме воспользуйтесь поиском.
user posted image
user posted image
PM MAIL   Вверх
smartov
Дата 6.3.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



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

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

Это сообщение отредактировал(а) smartov - 6.3.2008, 13:45
PM MAIL   Вверх
Fally
Дата 6.3.2008, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 265
Регистрация: 17.8.2006
Где: Dahla

Репутация: нет
Всего: 4



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


--------------------
Прежде чем задать вопрос на форуме воспользуйтесь поиском.
user posted image
user posted image
PM MAIL   Вверх
Feldmarschall
Дата 8.3.2008, 15:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



На месте всех отвечавших я бы задумался над вопросом "А действительно ли 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)

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

Ну, и на месте автора я бы задался отладкой своих скриптов. И, только в том случае, если отладка покажет, что проблема действительно в базе - заняться настройкой сервера.
PM   Вверх
del3d
Дата 8.3.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Код

set names cp1251;

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

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

А так как база данных будет создаваться в учебных целях на ПК с Linux (кодировка по умолчнию utf8), то исползование юникода, я думаю, оптимальный вариант..
PM MAIL   Вверх
Feldmarschall
Дата 8.3.2008, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



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

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

Кодировка OC к кодировке данных в бд и на сайте никакого отношения не имеет.
Но совет использовать однобайтную кодировку все равно неверный. Если есть кривизна с настройкой кодировки, то она вылезет и при однобайтной.
А проблема именно в насройке кодировок.
PM   Вверх
del3d
Дата 8.3.2008, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



Код

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;

странные вещи..
PM MAIL   Вверх
Feldmarschall
Дата 8.3.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



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

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

PM   Вверх
del3d
Дата 8.3.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.11.2007

Репутация: нет
Всего: нет



отлично!!!
Код

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   |
| хелло | Мир! |
+------------+---------+

PM MAIL   Вверх
smartov
Дата 8.3.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: нет
Всего: 259



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

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

Добавлено через 1 минуту и 29 секунд
del3d, проблема решена? Если да - пометь тему как решенную
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0847 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.