SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.12.2007 11:31:33

chessplayer
Завсегдатай
Зарегистрирован: 20.11.2007
Сообщений: 43

HEX() ?

После

SET NAMES cp1251;
SET character_set_server=cp1251;
SELECT HEX("AB");

получаем: 4142, т.е. коды символов A и B.

А после

SET NAMES cp1251;
SET character_set_server=cp1251;
SELECT HEX("ЫЯ");

получаем: D0ABD0AF. Почему так?

Неактивен

 

#2 09.12.2007 11:55:16

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: HEX() ?

У меня в Вашем примере так не получается (консоль koi8r).

mysql> SET NAMES cp1251;
Query OK, 0 rows affected (0.03 sec)

mysql> SET character_set_server=cp1251;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT HEX('ЫЯ');
+-----------+
| HEX('ЫЯ') |
+-----------+
| F9F1      |
+-----------+
1 row in set (0.00 sec)

Скорее всего консоль у Вас работает в UTF8. Вы задали SET NAMES cp1251, но передаете все равно символы в UTF8. Создайте таблицу в кодировке CP1251 и выполните HEX над полем таблицы. При этом SET NAMES следует установить в то значение, в котором работает клиент.

mysql> SET NAMES UTF8
mysql> CREATE TABLE tmpx (a varchar(10)) CHARSET=cp1251;
mysql> INSERT INTO tmpx VALUES ('ЫЯ');
mysql> SELECT * from tmpx;
mysql> SELECT HEX(a) from tmpx;

Неактивен

 

#3 09.12.2007 22:51:56

chessplayer
Завсегдатай
Зарегистрирован: 20.11.2007
Сообщений: 43

Re: HEX() ?

rgbeast, спасибо! И еще вопросик smile

После
SELECT HEX(a1) & HEX(a2);
где a1 и a2 – строки, не превышающие 8 символов (т.е. max 64 бита).
Можно получить не верные значения, т.к. HEX возвращает шестнадцатеричные значения без префикса 0x. Выйти из положения можно, загромоздив запрос функцией CONV:
SELECT CONV(HEX(a1),16,10) & CONV(HEX(a2),16,10);

Но нельзя ли решить задачу более простым путем?

Премного благодарен smile

Неактивен

 

#4 09.12.2007 23:49:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: HEX() ?

HEX возвращает строку, поэтому преобразование в любом случае необходимо, явное или неявное. Можно функцией CONCAT() добавить к началу строки '0x', но это будет более медленный путь, чем Ваш

Неактивен

 

#5 10.12.2007 21:41:16

chessplayer
Завсегдатай
Зарегистрирован: 20.11.2007
Сообщений: 43

Re: HEX() ?

rgbeast написал:

HEX возвращает строку, поэтому преобразование в любом случае необходимо, явное или неявное. Можно функцией CONCAT() добавить к началу строки '0x', но это будет более медленный путь, чем Ваш

Понятно, спасибо.

Неактивен

 

#6 10.12.2007 22:46:46

chessplayer
Завсегдатай
Зарегистрирован: 20.11.2007
Сообщений: 43

Re: HEX() ?

Кстати, вариант с использованием функции добавления к началу строки '0x' правильнее, т.к. CONV(“FFFFFFFFFFFFFFFF”,16,10) вернет 9223372036854775807 (7FFFFFFFFFFFFFFF) вместо правильного 18446744073709551615.

Неактивен

 

#7 10.12.2007 23:54:04

chessplayer
Завсегдатай
Зарегистрирован: 20.11.2007
Сообщений: 43

Re: HEX() ?

Продолжаю задавать вопросы smile

Раньше вместо запроса
SELECT (CONV(HEX(a1),16,10) & CONV(HEX(a2),16,10) = CONV(HEX(a3),16,10));
где a1, a2 и a3 – строки, не превышающие 8 символов (т.е. max 64 бита),
я использовал более громадный запрос, состоящего из ряда операций: [8 бит] & [8 бит] = [8 бит], … до тех пор, пока не исчерпаю все байты строк, участвующих в сравнении.

Я очень обрадовался, когда узнал, что операндами для ‘&’ могут быть 64-битные числа. Теперь ряд мелких операций, я заменил более емким вариантом: [64 бит] & [64 бит] = [64 бит].

Вопрос следующий:
Не выполняет ли MySQL операцию [64 бит] & [64 бит] = [64 бит], через ряд мелких, типа [8 бит] & [8 бит] = [8 бит]? Если это так, то получается, выигрыш в быстродействии от использования емкого варианта я не получу?! yikes

Неактивен

 

#8 11.12.2007 00:20:27

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: HEX() ?

Нет, не выполняет. MySQL всегда выполняет действия над 64-битными числами, даже
на 32-битной системе. Более того, 8-битные Ваши вычисления он тоже выполняет по
64-битной арифметике wink

Неактивен

 

#9 11.12.2007 12:07:07

chessplayer
Завсегдатай
Зарегистрирован: 20.11.2007
Сообщений: 43

Re: HEX() ?

Два вопроса:

1. Значит, перейдя на более емкий вариант запроса, я получаю выигрыш в быстродействии?

2. Как MySQL работает с 64-битными числами, если система 32-битная? Наверное, последовательно: сначала обрабатываются первые 32 бита числа, а потом вторые 32 бита числа. Или не так?

Огромный респект! Поистине это ценный ресурс smile

Неактивен

 

#10 11.12.2007 12:28:51

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: HEX() ?

1. да, и даже в основном не из-за арифметики. Арифметика выполняется очень быстро. Преобразование  строк и синтаксический анализ происходят на порядки медленнее. Поэтому лимитирующая операции - преобразование строки hex в число. Естественно эффективнее, когда это происходит один раз, а не несколько.

2. наверное так, хотя я не уверен, что она это делает для 8битовых чисел (чтобы ответить на вопрос, надо читать исходные коды MySQL), но согласно пунтку 1 это не важно

Неактивен

 

#11 11.12.2007 15:49:31

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: HEX() ?

По поводу пункта два: так говорил Тобиас smile

По поводу того, как - это не важно smile Зависит от libc, там есть int64, который как-то умеет
считать, вот стандартные штуки там и есть, ничего особенного. Про порядок не могу сказать
ничего, но по логике сначала обрабатывается младшее число, потом старшее. Чтобы флаг
переноса в addc учесть smile Разумеется, по 32 бита.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson