Here's a familiar example when number and strings are used interchangably.
SQL> create table t
2 ( pk char(10),
3 data varchar2(100)
4 );
Table created.
SQL>
SQL> insert into t select rownum, rpad(rownum,80,'x')
2 from dual
3 connect by level <= 100000;
100000 rows created.
SQL>
SQL> alter table t add primary key ( pk );
Table altered.
SQL>
SQL> set autotrace traceonly explain
SQL> select * from t
2 where pk = 123;
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 64 | 241 (1)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 64 | 241 (1)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(TO_NUMBER("PK")=123)
Because I mixed and matched datatypes, I silently disabled the use of my index on that query.