sql >> データベース >  >> RDS >> Mysql

文字列を、前に空のスペースがある文字列と、空のスペースがない文字列を比較する

    CHARタイプは、文字列をフィールドの長さまでnullバイトで埋めます (一方、VARCHARは文字列の終わりを示すために区切り文字を追加します-したがって、最後の余分なデータを無視します(私は空のバイトを意味します ))、したがって、最後にスペースがある比較はそれらを無視します。先頭のスペースは、文字列自体を変更するため、関連性があります。クリストファーの答えを参照してください。

    編集:さらに詳しく説明する必要があります

    以下のいくつかの実用的なテストを参照してください。 VARCHAR型は文字列にスペースを追加しますが、CHARフィールドは文字列をそのサイズまでスペースで埋めますが、比較時には無視します。特にLENGTHの2行目を参照してください 関数クエリ:

    mysql> create table test (a VARCHAR(10), b CHAR(10));
    Query OK, 0 rows affected (0.17 sec)
    
    mysql> insert into test values ('a', 'a'), ('a ', 'a '), (' a', ' a');
    Query OK, 3 rows affected (0.00 sec)
    Records: 3  Duplicates: 0  Warnings: 0
    
    mysql> select a, LENGTH(a), b, LENGTH(b) FROM test;
    +------+-----------+------+-----------+
    | a    | LENGTH(a) | b    | LENGTH(b) |
    +------+-----------+------+-----------+
    | a    |         1 | a    |         1 | 
    | a    |         2 | a    |         1 | 
    |  a   |         2 |  a   |         2 | 
    +------+-----------+------+-----------+
    3 rows in set (0.00 sec)
    

    ここで、MySQLは、挿入されたときの値が「a」であるCHARフィールドの長さが1文字しかないことを示しています。さらに、少しのデータを連結すると:

    mysql> select CONCAT(a, '.'), CONCAT(b, '.') FROM test;
    +----------------+----------------+
    | CONCAT(a, '.') | CONCAT(b, '.') |
    +----------------+----------------+
    | a.             | a.             | 
    | a .            | a.             | 
    |  a.            |  a.            | 
    +----------------+----------------+
    3 rows in set (0.00 sec)
    
    mysql> select CONCAT(a, b), CONCAT(b, a) FROM test;
    +--------------+--------------+
    | CONCAT(a, b) | CONCAT(b, a) |
    +--------------+--------------+
    | aa           | aa           | 
    | a a          | aa           | 
    |  a a         |  a a         | 
    +--------------+--------------+
    3 rows in set (0.00 sec)
    

    VARCHARは文字列の終わりを格納するため、スペースは連結に残ります。これはCHARタイプには当てはまりません。ここで、前のLENGTHを念頭に置いてください たとえば、2行目のフィールドaとbの長さが異なる場合、次のようにテストします。

    mysql> SELECT * FROM test WHERE a=b;
    +------+------+
    | a    | b    |
    +------+------+
    | a    | a    | 
    | a    | a    | 
    |  a   |  a   | 
    +------+------+
    3 rows in set (0.00 sec)
    

    したがって、CHARデータ型は文字列の最後の余分なスペースを無視してトリミングしますが、VARCHARはそうではありません-比較中を除いて、要約できます。 :

    mysql> select a from test where a = 'a ';
    +------+
    | a    |
    +------+
    | a    | 
    | a    | 
    +------+
    2 rows in set (0.00 sec)
    
    mysql> select a from test where a = 'a';
    +------+
    | a    |
    +------+
    | a    | 
    | a    | 
    +------+
    2 rows in set (0.00 sec)
    
    mysql> select a from test where a = ' a';
    +------+
    | a    |
    +------+
    |  a   | 
    +------+
    1 row in set (0.00 sec)
    

    では、CHARタイプについても同じことが言えますか?

    mysql> select a from test where b = 'a ';
    +------+
    | a    |
    +------+
    | a    | 
    | a    | 
    +------+
    2 rows in set (0.00 sec)
    
    mysql> select a from test where b = 'a';
    +------+
    | a    |
    +------+
    | a    | 
    | a    | 
    +------+
    2 rows in set (0.00 sec)
    
    mysql> select a from test where b = ' a';
    +------+
    | a    |
    +------+
    |  a   | 
    +------+
    1 row in set (0.00 sec)
    

    これは、 CHARタイプとVARCHARタイプのストレージメソッドが異なるが、文字列の比較については同じルールに従っていることを示しています 。末尾のスペースは無視されます。先頭のスペースは文字列自体を変更します。



    1. ON DUPLICATEKEYUPDATEから挿入/更新行の数を取得する

    2. nodejsの単一ファイルでmysqlデータベース接続を提供する方法

    3. SQL ServerのRAND()の例

    4. COMBGUIDのパフォーマンス値