なぜtanakaは数値に変換できないのか?

このQ&Aのポイント
  • MySQLの比較演算子では、文字列と数値の比較が行われる際に、暗黙的に文字列を数値に変換します。
  • しかし、MySQLでは数値に変換できない文字列はゼロに変換されます。
  • そのため、'tanaka'という文字列は数値に変換できないため、ゼロに変換されます。
回答を見る
  • ベストアンサー

my sqlについて

mysql> SELECT * FROM users WHERE id=0; +--------+--------+ | id | pwd | +--------+--------+ | tanaka | a2f9hy | | yamada | sn6s3n | +--------+--------+ これを実行した場合に 'tanaka'=0と解釈されます。 文字列と数値の比較の場合、暗黙に文字列を数値に変換してから比較します。 そして、MySQLに限り、数値に変換できない文字列は 0 に変換するからです。 この結果、'tanaka' = 0 は真になります。 と言うことですが、意味が理解出来ないのですが、 何故、tanakaは数値に変換できないのでしょうか。

  • MySQL
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5043/13172)
回答No.1

文字列を数値に変換すると表現していますが、実際には文字列に含まれる数字を抽出しているに過ぎません。 しかも文字列の先頭が数字でなければ変換不能と判断します。 「tanaka」には数字が含まれていませんので数値に変換できないと判断し「空」と変換され、数値の「空」はゼロと等価なので「0」です。 試しに「1satou」と言うユーザーを作って見てください。これは id = 1 で検索可能です。 でも「honda2」というユーザーを作っても id = 2 で検索できません。これは最初の1文字目が数字で無いので変換できないと判断して「0」に置き換えられています。

yodogou
質問者

お礼

良く理解出来ました。 本当に有難う御座いました。

関連するQ&A

  • mySQLで結果が無いときの処理

    $sql = "select * from test "; $sql .= "where id='".$_POST["id"]."' and pwd='".$_POST["pwd"]."'"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) { if($row){ $msg = "OK"; } } としていますが、NGのときってどういう風にしたらいいのでしょうか? 基本的なことですみませんが、教えてください。

    • ベストアンサー
    • PHP
  • PDOで取得すると全てSTRING型で取得する?

    PDOを利用してprepareとbindValueでPDO::PARAM_INTなどと型指定をしてINSERTしているのですが、ネットをいろいろ見てみると「型指定をしてもexecute()時に全ての型は文字列として扱われる」と書いています。 これはデータベースの各カラムの型は無視して全て文字列としてINSERTしているのでしょうか? それともデータベースの型にMySQL側で勝手に変換して値を挿入してくれるのでしょうか? INSERTした数値を含むデータをprepareでSELECTしてexecute()してみると数値を含めて全てのカラムがstringとして取得しています。 MySQL側ではカラムの型をINTやFROATとして定義しても数値を文字列として挿入するとMySQL側も文字列として扱うのですか?それとも数値に変換されて挿入されますか? もし文字列として挿入されたらインデックスに影響しますか? いまいちどうすればいいのかわかりません。 一応 $id = 1; $name = "hoge"; $float = 0.055; $stmt = $dbh->prepare("INSERT INTO REGISTRY (id, name, float) VALUES (:id, :name, :float)"); $stmt->bindValue(:id, $id, PDO::PARAM_INT); $stmt->bindValue(:name, $name, PDO::PARAM_STR); $stmt->bindValue(:float, (string)$float, PDO::PARAM_STR); としています。 あと、PDO::PARAM_FLOATはないみたいで、PDO::PARAM_STRにすべきと書いていますが、このように指定してもMySQL側で勝手にFLOAT型に変換して値をINSERTするのでしょうか? どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • ASP(VBScript) & SQL Server でのエスケープ処理

    現在、 ASP(VBScript) & SQL Server で開発しております。 PHP & MySQL では 文字列型:mysql_escape_string 数値型:intval PHP & PostgreSQL では 文字列型:pg_escape_string 数値型:intval ですが、 ASP(VBScript) & SQL Server にはそのような関数がありますでしょうか? ない場合は自作しなければならないのですが、 エスケープする文字は「'」のみで大丈夫でしょうか? ご教授いただければ幸いです。

  • 秀丸でSQLを書く際に SQLの予約語だけ大文字

    秀丸でSQLを書く際に SQLの予約語だけを、大文字に変換するよい方法は? たとえば select * from table_1 where id=1 order by id desc; と書いて、マクロを起動すると SELECT * FROM talbe_1 WHERE id=1 ORDER BY id DESC; となるようにするよい方法はありませんか? また、予約語が「強調」されると尚良いです。

  • vbscriptの偽条件処理について

    VBスクリプトで以下の処理をさせたいのですが 行き詰まってしまいました。お助けください 以下のようにfilename.txtというファイルがあり 人名と文字列があります。 このうち、特定の文字列が"存在しない"人名を出力したいのです。 例えば、「abcde」をキーとするとyamada,satoを出力したいです。 「zzzz9」をキーとするとyamadaと出力する具合です。 よろしくお願いいたします filename.txt(定義ファイル) ---------------------- yamada xxx1 yamada yyy4 tanaka zzzz9 tanaka abcde sato zzzz9 ----------------------

  • SQL構文でカラム名をハッシュのキーに

    PerlをDBIでMySQLに接続しています。 MySQLの“country”テーブルに“name_en”カラムがあり、これをハッシュのキーにして、 下記構文で“name_jp”カラムに文字列を挿入しようとしたのですが、 ----------------------------------------- $sth = $dbh -> prepare ("update country set name_jp = \'$name{name_en}\' where id between 1379 and 1396"); ----------------------------------------- 結果は何も入りませんでした。 カラム名をハッシュのキーにするには、どう書けばいいのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Perl
  • 複数テーブルをまとめてソート

    たとえば次のような、都道府県ごとのテーブルがあり、 ID、名前、得点の列があるとします。 テーブル1(テーブル名:tokyo) ID NAME SCORE 1 yamada 89 2 tanaka 45 テーブル2(テーブル名:osaka) ID NAME SCORE 1 sato 65 2 suzuki 22 これらのテーブルをまとめて、全国で得点が上位順に並べたいと 思っております。また、結果にはどのテーブルに所属するものかを 判別する列を追加したいのですが、どういう文を記述したらよいのでしょうか? 望みの結果は次のようなものです。 NAME SCORE TABLE_NAME yamada 89 tokyo sato 65 osaka tanaka 45 tokyo suzuki 22 osaka よろしくお願いします。

    • ベストアンサー
    • MySQL
  • オラクルSQLの問題でDECODE関数について

    オラクルSQLの問題でDECODE関数について教えて下さい。 SELECT employee_id, DECODE(department_id,80, DECODE(commission_pct,NULL,'NO COMMISSION', salary * commission_pct), 'NOT SALES'} "COMMISSION" FROM employees; 上記のは 『DEPATMENT_ID列が80の場合でかつCOMMISSION_PCT列がNULL値の場合は「NO COMMISSION」、NULL値でない場合は「SALARY*COMMISSION_PCT」が文字列に変換されて戻されます。また、DEPARTMENT_ID列が80以外の場合は「NOT SALES」が戻されます。』と解説があり、 次に SELECT employee_id, DECODE( NULL IF(commission_pct,NULL), 0,salary * commission_pct, 'NO COMMISSION') "COMMISSION" FROM employees; このコードについては 『DECODE関数が最初に戻す「SALARY*COMMISSION_PCT」が数値型なので、「NO COMMISSION」が数値に変換できないためエラーになります。』 と解説がありました。 正常に実行できるのは前段のもので後段はできないとのことなのですがどうしてかわかりません。 なぜ後段では数値型に変換する必要があるのか、前段では同じsalary*commission_pctが文字列として扱っているのかわかりません。 DECODE関数の DECODE(α、         β、γ          δ) αがβのときはγを戻し、それ以外のときはδを戻すという公式があると思いますが、 もしかしてγとδは同じ型でなければいけないというルールがあるのでしょうか。でもたとえそうだとしてもまだ解せない部分があるのですが・・・。ご教授どうかよろしくお願いいたします。これはオラクルブロンズSQLの参考書の模擬試験にあった問題になります。

  • VB2008による数値の比較

    円周率暗記練習のプログラミングをVB2008で行なっています。 文字列であればLike演算子で前方一致を真とすることができるのでしょうが 数値の場合は簡単にはいかないのですか? 要は3.14や3.1415のように途中まで合っていれば真としたいのです。 自分なりに考えたのですが次のような方法があるのかなと思います。 普通に配列を利用する。 数値を文字列に変換してLike演算子を使う? VB2008で利用できる機能がある? 初心者なので数値と文字列の明確な違いも良く分かっていません。 配列を利用するのは面倒そうなので簡単な方法を知りたいのです。 よろしくお願いします。

  • SQL文のエラー

    SQL文でエラーが表示されます。どの部分を修正すればいいですか? SQL文が長いので文字列を結合する演算子「.」を使って複数行に分けています。 エラー内容:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ? and product_id = product.id' at line 2 //商品番号だけでなく、商品名や価格も表示したいので商品情報を保持するproductテーブルと 結合する。 //全て取得するのでSELECTは* //favoriteテーブルにはcustomer_idとproduct_id //productテーブルにはid, name, price $sql = 'SELECT * FROM favorite, product' . 'WHERE customer_id = ? and product_id = product.id '; // ?に顧客番号を指定する。 // favoriteテーブルの商品番号(product_id列)と、productテーブルの商品番号(id列)が // 一致している行だけが必要なので、WHERE句に条件を追加する。