2

これは奇妙に聞こえるかもしれませんが、整数として格納されている特定の列のすべてのエントリを把握する方法が必要です。

過去に誰かが MySQL の厳密モードをオンにせずにこの列を整数から varchar に変換したようです。

作品:

SELECT * FROM inv_array where serial = 187870123

動作しません:

SELECT * FROM inv_array where serial = '187870123'

シリアル列はvarcharとして構成されているため、上記は機能するはずですよね? MySQL はこれらの整数を varchar としてキャストすべきではありませんか? 私は夢中になっていますか?

シリアルが整数として格納されているこのデータベース内のすべてのエントリを見つけて、varchar に変換する必要があります。

4

3 に答える 3

3

データに問題があると思います。データが として保存されていると仮定するとVARCHAR、上記が最初のクエリでは機能し、2 番目のクエリでは機能しない理由は、MySQL がVARCHARフィールド内のデータを整数に変換して最初のクエリと比較しようとするためです。整数を比較するには、最初のすべての非アルファベット文字が必要です。

これは、実際に表示する方が簡単です。

ここにSQL Fiddleがあります。

改行などの VARCHAR フィールドにデータがある場合、最初のクエリは改行まで一致するため機能します。同様に、データが 123XYZ で、それを 123 と比較すると、それが返されます。これは、MySQL が整数値で検索するときに 123XYZ を 123 に変換するためです。

CREATE TABLE inv_array  (id int, serial varchar(100));
INSERT INTO inv_array VALUES (1, '123XYZ
                                 ');
SELECT * FROM inv_array where serial = 123; #returns records
SELECT * FROM inv_array where serial = '123XYZ'; #does not return any records

お役に立てれば。

幸運を。

于 2013-02-08T21:16:19.167 に答える
1

ほとんどの場合、いくつかの行にいくつかのスペースがあります。

そのような行は、次のような正規表現で見つけることができます:

先頭にスペースがある数字

select * from inv_array where serial REGEXP ' +[0-9]+'

末尾にスペースがある数値

select * from inv_array where serial REGEXP '[0-9]+ +'
于 2013-02-08T21:23:45.600 に答える
0

それらがすべて VARCHAR であり、INT を検索したい場合は、CAST を使用して、データベースに大きな変更を加えることなくこれを行うことができます。

VARCHAR から INT

SELECT * FROM inv_array WHERE CAST(SERIAL_VARCHAR AS UNSIGNED) = 187870124;

INT から VARCHAR

SELECT * FROM inv_array_1 WHERE CAST(SERIAL_INT AS CHAR) = '187870124';

恒久的な解決策として、テーブルの更新をお勧めします。

SQL フィドルのデモ

先頭にゼロがある場合は、選択クエリでそれらを削除する方法を示します。 SELECT trim(leading 0 FORM serial) FROM inv_array WHERE serial = 187870124.

于 2013-02-08T21:35:04.513 に答える