7

列に単一の空白文字の値があるかどうかを確認したい。

最初はそう思った

WHERE my_column = ' '

理にかなっています。しかし、いいえ。これは、何らかの理由で複数のスペースを持つ列にも一致します。

SELECT '    ' = ' '           => true

したがって、正規表現または 16 進エンコーディングを使用してテストできます。

WHERE HEX(my_column) = '20'
WHERE my_column REGEXP '^\ $'

どちらも機能します。しかし、どちらも (確かに後者) 非常に非効率的であると思います。

より良い方法はありますか?

4

3 に答える 3

11

完全に一致させるには、2つの文字列をBINARY比較する必要があります

通常の状況では、末尾の空白は比較では考慮されませんが、BINARYオペレーターはそれを次のように強制します。

BINARYを使用すると、末尾のスペースも重要になります。

mysql> SELECT BINARY '   ' = ' ';
+--------------------+
| BINARY '   ' = ' ' |
+--------------------+
|                  0 |
+--------------------+

ちなみに、末尾の空白の問題の影響を受けるのは、空白だけの比較ではありません。

mysql> SELECT 'abc   ' = 'abc';
+------------------+
| 'abc   ' = 'abc' |
+------------------+
|                1 |
+------------------+

...しかし...

mysql> SELECT BINARY 'abc   ' = 'abc';
+-------------------------+
| BINARY 'abc   ' = 'abc' |
+-------------------------+
|                       0 |
+-------------------------+

...さらに紛らわしいことに、先頭の空白重要です。

mysql> SELECT ' abc   ' = 'abc';
+-------------------+
| ' abc   ' = 'abc' |
+-------------------+
|                 0 |
+-------------------+

索引付けについて:

BINARY文字列でインデックスが使用されないようにします。ただし、ドキュメントのメモでは、次のように、比較の文字列リテラル側に演算子が適用された場合にインデックスが使用されることが示されています。BINARY

SELECT * FROM `tbl` WHERE `col` = BINARY 'string   '
于 2012-11-08T14:41:33.433 に答える
3
where my_column = ' ' and LENGTH(my_column) = 1
于 2012-11-08T14:39:21.203 に答える
0

SELECT CASE WHEN COL_NAME=' ' THEN 'yes' ELSE 'no' END AS SPACE_INDICATOR FROM Table_NAME WHERE LENGTH(COL_NAME)=1;

于 2012-11-08T14:44:45.463 に答える