pua3258
@pua3258

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

型はあっているはずなのに1054エラーが発生する

Q&A

Closed

セルフ解決!
でも腑に落ちない解決なのでなにか情報あればコメントお願いします!

解決したいこと

MySQLのINSERT INTO文で予期しないエラー(1054)が発生しました
TEXT型で「`」を付加しているにも関わらずエラーが発生します

前提

RDBMS:MySQL 8.0.32
管理ツール:HeidiSQL 12.4.0.6659
OS:Windows11 Home 22H2
プロセッサ:AMD Ryzen 9 5900X 12-Core Processor 3.70 GHz
RAM:32.0 GB

発生している問題・エラー

入力した内容

INSERT INTO `m_brand`
(`BRAND`,`NAME`)
VALUES(1,`MO`);
/* SQL エラー  (1054): Unknown column 'MO' in 'field list' */

画像
image.png

image.png

自分で試したこと

このエラーコード自体は初歩的なエラーなこともありすぐ理解できまして、要するに
データ型に合わせて「"」「`」を付けたり外したりとすれば良いという認識でした。
そのため今回の場合はVALUES(1,`MO`); にすれば解決するはずです。しかしながら、最初から「`」を付加していたためなぜエラーが発生するのかがわかりませんでした。
意味があるのかわかりませんが、一応「``」を「""」に変えてみたりもしました。しかし同じエラーが出るのみで改善はしませんでした。
何が原因なのでしょうか。
ご存じの方はぜひご教示のほど、よろしくお願いします。

思ったこと

エラーをよく見るとシングルクォーテーションが含まれているように見えるのですが・・・

解決

サイトによってはシングルクォーテーション(shift + @)、またはダブルクオーテーションを入力するようにと記載のある事があるが、なぜか自分の環境では 値に関しては アポストロフィーしか受け付けてくれなかった。
意味わからん。。けど解決したしまあいいや

解決の詳細(23年4月6日20時追記)

image.png
image.png
image.png
image.png
なんでバリューだけ「``」で受け付けてくれない??逆なんでバリュー以外はクエリOK???
意味わからん
まあ教訓はとにかくバリュー(値)だけは「``」(Shift+@)で囲むなと言うことです!
image.png
image.png

0

2Answer

なぜか自分の環境では

どんな環境なのか明記していないので分かりませんが(Win or Linux系列等)
シングルクオート'
バッククオート `(「'」に見える文字)を混同していませんか?
(以下は参考記事です)

以下のASCIIコード表で確認してもらえれば、
「コンピューターの処理では厳密に違う」と理解が深まるかと思います。

また、

質問記載.sql
INSERT INTO `m_brand` (`BRAND`,`NAME`) VALUES(1,`MO`);

上記SQL自体が構文として不正確に見えるのですが、
直接的には関係ないでしょうか。

改善案.sql
INSERT INTO m_brand (BRAND, NAME) VALUES (1, 'MO');

補足で細かい話になりますが、
「アポストロフィー」と「シングルクオート(クォート)」は
示す文字'は変わりませんが、
「引用符で使用するか」等で呼称が変わることがあります。
(IT界隈では概ね、後者の呼称の方が多いです)

0Like

Comments

  1. @pua3258

    Questioner

    とても参考になるコメントを、ありがとうございます。
    その件についてはいろいろ調べており、まずSQL文自体の記述の仕方について確認しました。上記のとおりシングル、またはダブルクオーテーションで囲む旨記載があり、サイトによって「Shift + @」と明示的に書かれているサイトもありましたので、問題ないかと思い記事にはバッククオート`で記述したものを掲載させていただきました。(自分の目でははっきり見たつもりでしたが、今一度調べ直してみるとその「Shift + @」と記載のあるサイトが見当たらず、何かしら見間違えていたのかもしれませんが…)

    また、ご指摘頂いたようにバッククオート`が問題なのかとも思いまして、すべてをシングルにしたりダブルにしたりしてみましたが、改善されず、最終的にVALUESだけシングルクオート、他はバッククオートで囲んだら解決しました(意味がわからない)

    今は外出中ですから、帰宅したら改めて解決したときの状況を追記し記事を更新させていただきます。

テーブル名やカラム名は識別子と呼ばれ文字列などのリテラルとは異なります。

0Like

Comments

  1. @pua3258

    Questioner

    コメント、並びに当方の理解のためのご協力に感謝いたします。

    仰っている意味はわかるのですが、記事のどの点に対するコメントでしょうか。
  2. MySQLにおいて、識別子はバッククォートで括り(必ずしも必要というわけではありませんが)、文字列はシングルクォートかダブルクォートで括ります。

    "すべてをシングルにしたりダブルにしたりしてみましたが、改善されず、最終的にVALUESだけシングルクオート、他はバッククオートで囲んだら解決しました"というのはそういうことです。
  3. @pua3258

    Questioner

    なるほど、そのような違いがあったのですね!
    いろいろ調べたつもりでしたが、識別子とリテラルの記述方法について、そのことは知りませんでした。
    ありがとうございます。

Your answer might help someone💌