質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

4回答

1826閲覧

MySQLで、VARCHAR型のカラムとintを=で比較した場合、=が自動でlikeになっている?

shun8

総合スコア17

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/02/26 08:31

MySQLの=の仕様がわからず、悩んでいます。

SQL

1SELECT * FROM テーブル WHERE VARCHAR型のカラム = '2';

これだと、VARCHAR型のカラムが2のレコードのみがselectされるのですが、

SQL

1SELECT * FROM テーブル where VARCHAR型のカラム = 2;

これだと、0002や、2aaaのようなレコードも取得してしまいまして、

MySQLが自動で=をlikeに置き換えているように見えます。

SQLServerやOracleでは上の場合も下の場合も同じ結果になると聞いたのですが、これはMySQLだけの仕様なのでしょうか。

ググッってもこれという記事が出てこないので、とても気になっています。

回答いただけたらありがたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

暗黙の型変換はlikeではなく、文字列型の先頭から数値にキャスト出来るところまでキャストされます。

'0002' → 2
'2aaa' → 2
'aaa2' → 0

投稿2018/02/26 08:44

naga3

総合スコア1293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun8

2018/02/26 09:11

そういえば型変換してるのだと思い改めてググり直したところ、 https://haushinka2dx.blogspot.jp/2012/09/mysqlvarcharint.html http://blog.usoinfo.info/article/180598548.html https://dev.mysql.com/doc/refman/5.6/ja/type-conversion.html https://blog.tokumaru.org/2009/09/implicit-type-conversion-of-SQL-is-trap-full.html#p01 参考記事をいくつか見つけられました。 likeでなく、文字列型を浮動小数点数型に変換しているのですね。 簡潔にまとまっていてかつ迅速な回答いただき、ありがとうございました。
guest

0

仮に'200'とかでチェックすればわかりますが、200は2と合致しないのでLIKEではありませんね
そもそも自動キャストを期待して処理してはいけませんね

投稿2018/02/26 08:58

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun8

2018/02/26 09:14

200でチェックしてみて、確かに合致しませんでした。 PHP使ってるので、やはり型に鈍感になっていたと思います。 回答ありがとうございました。
guest

0

SQLServerはこんな感じになります。
「SQLServerやOracleでは上の場合も下の場合も同じ結果になると聞いた」とありますが
同じ結果にはならないんじゃないですかね?少なくとも'0002'=2はダメなような気がするんですが…

SQL

1select case when 2='2' then 'true' else 'false' end as [2='2'] 2 ,case when 2='20' then 'true' else 'false' end as [2='20'] 3 ,case when 2='02' then 'true' else 'false' end as [2='02'] 4 ,case when 0='0' then 'true' else 'false' end as [0='0'] 5 ,case when 0='' then 'true' else 'false' end as [0='']

イメージ説明

投稿2018/02/26 08:51

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shun8

2018/02/26 09:13

ありがとうございます! 周りの人にチラッと聞いただけなので、間違っていたのだと思います。 実際に書いていただき、ありがとうございました。
guest

0

SQL

1SELECT * FROM テーブル where VARCHAR型のカラム = 2;

2を文字型に変換してからVARCHAR型のカラムと = をとります。
暗黙の型変換に頼るとパフォーマンスが落ちるなどろくなことがないので、データ型の管理はしっかりやってください。

投稿2018/02/26 08:37

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問