mysql bur or ...
4 отговора
191 прегледа
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
имам база данни в която се съхраняват деиствията на клиента. ако клиента е влязъл с потребителско име и парола се съхранява неговото ид ако не е се съхранява неговото 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
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
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
Re: mysql bur or ...
Има преобразувания винаги когато се засичат различни типове данни.
Имаше доста добро описание на преобразуванията - кога и как се правят.
Тоест не е бъг.
Bеer? Mоre?
Плацебото
Имаше доста добро описание на преобразуванията - кога и как се правят.
Тоест не е бъг.
Bеer? Mоre?
Плацебото
Re: mysql bur or ...
Това че има преобразувания е ясно обаче не трябва ли нещо от рода на 0.0.0.0 да се възприема като стринг тъй като полето ми е от тип varchar пък и не прилича на double както и да се погледне или в случая типа на полето се пренебрегва.
Break The UnBreakable
Break The UnBreakable
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...
А и '90.0.169.206'=90 не е същото като '90.0.169.206'='90'. За да постигнеш второто използвай CAST(90 as char)='90.0.169.206' .
Everything louder than everything else...