LINUX.ORG.RU

mysql - encode, decode что-то не пойму


0

0

Делаю таблицу
CREATE TABLE admins (
  name varchar(24) default NULL,
  password varchar(16) binary NOT NULL default '',
) ;

INSERT INTO admins VALUES ('admin',ENCODE('admin', 'test'));

Затем
SELECT if(DECODE(password, 'test')='admin', 0, 1) AS DECODE FROM admins WHERE name='admin';
Возвращает 1.

Но
SELECT if(DECODE(ENCODE('admin', 'test'), 'test')='admin', 0, 1) AS DECODE; 

выдает 0.

mysqld Ver 5.0.24a-log for pc-linux-gnu on i686 (Gentoo Linux mysql-5.0.24-r1)
anonymous

mysql> INSERT INTO admins VALUES ('admin',ENCODE('admin', 'test') ERROR 1406 (22001): Data too long for column 'password' at row 1

может поэтому ?

да ещё, varchar binary - не совсем то для хранения бинарных строк, фактически это просто значит для сравний будет использоваться latin1, для хранения бинарных строк лучше использовать binary и varbinary - при их сравнениях используется 'пустая' кодировка :)

<cite>

The BINARY and VARBINARY data types are distinct from the CHAR BINARY and VARCHAR BINARY data types. For the latter types, the BINARY attribute does not cause the column to be treated as a binary string column. Instead, it causes the binary collation for the column character set to be used, and the column itself contains non-binary character strings rather than binary byte strings. For example, CHAR(5) BINARY is treated as CHAR(5) CHARACTER SET latin1 COLLATE latin1_bin, assuming that the default character set is latin1. This differs from BINARY(5), which stores 5-bytes binary strings that have no character set or collation.

</cite>

кстати, хранить пароли в базе, пусть даже и в зашифрованном виде - моветон :) храните так хеши..

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

Вопрос снят - по умолчанию использовалось utf-8, установил DEFAULT CHARACTER SET latin1 DEFAULT COLLATE latin1_general_ci;.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.