sql >> Databáze >  >> RDS >> Mysql

mysql:proč porovnávání „řetězce“ s 0 dává pravdu?

MySQL automaticky přetypuje řetězec na číslo:

SELECT '1string' = 0 AS res; -- res = 0 (false)
SELECT '1string' = 1 AS res; -- res = 1 (true)
SELECT '0string' = 0 AS res; -- res = 1 (true)

a řetězec, který nezačíná číslem, je vyhodnocen jako 0:

SELECT 'string' = 0 AS res;  -- res = 1 (true)

Samozřejmě, když se pokoušíme porovnat řetězec s jiným řetězcem, nedochází k žádné konverzi:

SELECT '0string' = 'string' AS res; -- res = 0 (false)

ale převod můžeme vynutit například pomocí operátoru +:

SELECT '0string' + 0 = 'string' AS res; -- res = 1 (true)

poslední dotaz vrací TRUE, protože sčítáme řetězec '0string' s číslem 0, takže řetězec musí být převeden na číslo, stane se SELECT 0 + 0 = 'string' a pak znovu je řetězec 'řetězec' převeden na číslo, než je porovnán s 0, a poté se změní na SELECT 0 = 0 což je PRAVDA.

Toto bude také fungovat:

SELECT '1abc' + '2ef' AS total; -- total = 1+2 = 3

a vrátí součet řetězců převedených na čísla (v tomto případě 1 + 2).



  1. Jak zkontrolovat, zda pole PostgreSQL obsahuje hodnotu

  2. Vyladění operací vstupu/výstupu (I/O) pro PostgreSQL

  3. Je opravdu nutné vytvářet SQLite tabulky při každém spuštění aplikace?

  4. Jak zobrazit kód CREATE VIEW pro zobrazení v PostgreSQL?