varchar和int列之间的比较问题

时间:2015-02-28 11:55:45

标签: mysql mariadb

我的varchar列与int列之间存在一些奇怪的比较问题。

我的架构

CREATE TABLE `organization_m` (
    `organization_recid` VARCHAR(36) CHAR SET utf8 NOT NULL COMMENT 'uuid - unique identifier'
    ,`organization_id` INT (16) NOT NULL AUTO_INCREMENT
    ,`organization_name` VARCHAR(100) CHAR SET utf8 NOT NULL
    ,`organization_sequence` INT (11) DEFAULT NULL
    ,`license_recid` VARCHAR(36) CHAR SET utf8 NOT NULL
    ,`country_recid` VARCHAR(36) CHAR SET utf8 NOT NULL
    ,`contact_number` VARCHAR(20) CHAR SET utf8 DEFAULT NULL
    ,`address` VARCHAR(200) CHAR SET utf8 DEFAULT NULL
    ,`organization_url` VARCHAR(100) CHAR SET utf8 NOT NULL
    ,`notes` VARCHAR(500) CHAR SET utf8 DEFAULT NULL
    ,`is_active` TINYINT (1) DEFAULT NULL
    ,`created_on` DATETIME DEFAULT NULL
    ,`modified_on` DATETIME DEFAULT NULL
    ,`created_by` VARCHAR(50) CHAR SET utf8 DEFAULT NULL
    ,PRIMARY KEY (`organization_recid`)
    ,UNIQUE KEY `organization_id`(`organization_id`)
    ,UNIQUE KEY `organization_sequence`(`organization_sequence`)
    ) ENGINE = InnoDB AUTO_INCREMENT = 8622 DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

--
-- Dumping data for table `organization_m`
--
LOCK TABLES `organization_m` WRITE;
    /*!40000 ALTER TABLE `organization_m` DISABLE KEYS */;

INSERT INTO `organization_m`
VALUES (
    '017811ce-becf-4395-a780-9bde07c4a692'
    ,1268
    ,'123'
    ,NULL
    ,'cd224237-668b-11e4-945d-000c29609978'
    ,'cd2276db-668b-11e4-945d-000c29609978'
    ,NULL
    ,'somewhere'
    ,'/api/v1/somewhere'
    ,NULL
    ,1
    ,'2015-02-23 13:43:22'
    ,'2015-02-23 13:43:22'
    ,NULL
    )
    ,(
    '9f14dc52-23c7-4567-8ec9-90aa45c87799'
    ,1275
    ,'cards'
    ,NULL
    ,'cd224237-668b-11e4-945d-000c29609978'
    ,'cd227f0c-668b-11e4-945d-000c29609978'
    ,NULL
    ,'somewhere to nowhere'
    ,'/api/v1/cards'
    ,NULL
    ,1
    ,'2015-02-27 16:17:25'
    ,'2015-02-27 16:17:25'
    ,NULL
    )
    ,(
    'b469e572-86a4-4019-96c5-a6df964e520b'
    ,9
    ,'123'
    ,1143
    ,'cd224237-668b-11e4-945d-000c29609978'
    ,'cd227f0c-668b-11e4-945d-000c29609978'
    ,NULL
    ,'New York'
    ,'OSMO1143'
    ,NULL
    ,1
    ,'2015-01-20 13:45:40'
    ,'2015-01-20 13:45:40'
    ,NULL
    );
    /*!40000 ALTER TABLE `organization_m` ENABLE KEYS */;

UNLOCK TABLES;

我的选择查询

SELECT * FROM organization_m WHERE organization_id = '9f14dc52-23c7-4567-8ec9-90aa45c87799' OR 
organization_recid = '9f14dc52-23c7-4567-8ec9-90aa45c87799';

我的结果集

Query Resultset


问题

我预计只有一个结果是rec_id为organization_recid = '9f14dc52-23c7-4567-8ec9-90aa45c87799';的组织。我不确定这是否是预期的行为,但有没有办法解决这个问题?


其他数据库信息

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1710
Server version: 10.0.16-MariaDB-1~wheezy mariadb.org binary distribution

Copyright (c) 2000, 2014, Oracle, MariaDB Corporation Ab and others.

1 个答案:

答案 0 :(得分:1)

DB会自动将您传递的字符串organization_id转换为整数(因为这是它的类型)。

9f14dc52-23c7-4567-8ec9-90aa45c87799转换为int等于9.(它停在第一个char,因为第二个char不是整数)。您可以通过执行以下查询来查看转换:

select CONVERT('9f14dc52-23c7-4567-8ec9-90aa45c87799', SIGNED);

这就是您使用organization_id = 9获得第二行的原因。

基本上,您的查询被解释为:

SELECT * FROM organization_m WHERE organization_id = '9' 
OR  organization_recid = '9f14dc52-23c7-4567-8ec9-90aa45c87799'

我不知道该代码的上下文是什么,但在查询中使用时,应始终过滤/清理值。

掌控。如果您期望一个整数,那么请确保它是一个整数。否则,你最终会遇到一个奇怪的行为/错误。