Mysql
 sql >> база данни >  >> RDS >> Mysql

Неочаквани резултати от MySQL:IN-клауза (число, 'низ') в колона с varchar

Изразът ви е:

where varCharColumn in (-1, '')

Списъкът трябва да има последователни типове. Първият елемент казва "това е списък с цели числа", така че втората стойност се преобразува в цяло число. И '' става 0 .

Всъщност всеки буквено-цифров низ, който започва с нецифрено число, също се преобразува в 0 за целочислено сравнение. И така, имате тази ситуация

'A' in (0)   --> TRUE
'B' in (0)   --> TRUE
'A' in ('B') --> FALSE

Можете лесно да тествате това с:

select 'A' in (0) union all
select 'B' in (0) union all
select 'A' in ('B');

Можете да го видите в действие с колона:

select val in (0), val in ('0'), val in (0, '')
from (select 'A' as val) t

Това връща true, false, true. Обърнете внимание обаче, че val in (-1, 'B') връща FALSE в този случай. MySQL третира празния низ по различен начин от реалния низ, може би в противоречие с документацията.

Че това е вярно с колоните е показано от:

select val in (0)
from (select 'A' as val) t;

Кой каза, че логиката не може да бъде забавна?

За да коригирате това, направете списъка да бъде от последователни типове, вероятно като поставите единични кавички около числата.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL неправилен формат на DATETIME

  2. Как да актуализирате автоматично данни в базата данни в PHP

  3. Причина за неправилно конфигурирана MySQL:опасно използване на относителен път

  4. SQL заявката връща данни от множество таблици

  5. PHP MySql неизвестен хост на сървъра