mysql bur or ...

4 отговора 191 прегледа
#1

mysql bur or ...

Здравейте днес попаднах на нещо много странно. Разбира се знам че има елегантни решения на това но просто така го заварих за това моля да не критикувате текущото решение. ето все пак на какво попаднах:
имам база данни в която се съхраняват деиствията на клиента. ако клиента е влязъл с потребителско име и парола се съхранява неговото ид ако не е се съхранява неговото IP.

така наложи се да правя връзки между две таблици с потребителското ид и тази с действията на клиента и се поличи не това което очаквах. помислих си че аз съм сбъркал нещо но след няколко теста ето какво открих:


mysql> select '90.0.169.206' = 90;
+---------------------+
| '90.0.169.206' = 90 |
+---------------------+
| 1 |
+---------------------+
1 row in set, 1 warning (0.06 sec)

това според мен би трябвало да върне 0;

mysql> show variables like '%version';
+------------------+---------------------+
| Variable_name | Value |
+------------------+---------------------+
| protocol_version | 10 |
| version | 5.0.21-community-nt |
+------------------+---------------------+
2 rows in set (0.47 sec)

това е версията която ползвам. Тествах го под linux и windows с различни версии. 3.23,4.0,4.1,5.0

Навсякъде резултата е един и същ. въпроса ми е това бъг ли е или аз нещо недоразбирам.

Break The UnBreakable
Отговор
в отговор на nupaT #2

Re: mysql bur or ...

Не бях обърнал внимание на 1 warning.

mysql> select '90.0.169.206' = 90;
+---------------------+
| '90.0.169.206' = 90 |
+---------------------+
| 1 |
+---------------------+
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
+---------+------+--------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '90.0.169.206' |
+---------+------+--------------------------------------------------+
1 row in set (0.08 sec)

до тук ясно опитва се да възприеме 90.0.169.206 като число (double) и отрязва всичко след втората точка включително (90.0 = 90 - 1)но не трябва ли да се възприема като стринг в случая ?

Break The UnBreakable
Отговор
в отговор на nupaT #3

Re: mysql bur or ...

Има преобразувания винаги когато се засичат различни типове данни.
Имаше доста добро описание на преобразуванията - кога и как се правят.
Тоест не е бъг.

Bеer? Mоre?
Плацебото
Отговор
в отговор на bira_more #4

Re: mysql bur or ...

Това че има преобразувания е ясно обаче не трябва ли нещо от рода на 0.0.0.0 да се възприема като стринг тъй като полето ми е от тип varchar пък и не прилича на double както и да се погледне или в случая типа на полето се пренебрегва.

Break The UnBreakable
Отговор
в отговор на nupaT #5

Re: mysql bur or ...

По принцип има правила, по които се правят сравненията при различни типове, но все пак, за да си абсолютно сигурен използвай CAST.

А и '90.0.169.206'=90 не е същото като '90.0.169.206'='90'. За да постигнеш второто използвай CAST(90 as char)='90.0.169.206' .

Everything louder than everything else...
Отговор