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

一意のフィールドを持つMySQLデータベースは終了スペースを無視します

    問題は、MySQLが文字列比較を行うときに末尾の空白を無視することです。 http://dev.mysql.com/doc/refman/を参照してください5.7 / en / char.html

    (この情報は5.7用です。8.0ではこれが変更されました。以下を参照してください)

    likeのセクション 演算子はこの動作の例を示します(そしてlike 末尾の空白を尊重します):

    mysql> SELECT 'a' = 'a ', 'a' LIKE 'a ';
    +------------+---------------+
    | 'a' = 'a ' | 'a' LIKE 'a ' |
    +------------+---------------+
    |          1 |             0 |
    +------------+---------------+
    1 row in set (0.00 sec)
    

    残念ながら、UNIQUE indexは、標準の文字列比較を使用して、そのような値がすでに存在するかどうかを確認しているようです。したがって、末尾の空白は無視されます。これは、VARCHARの使用とは無関係です。 またはCHAR 、どちらの場合も、一意のチェックが失敗したため、挿入は拒否されます。 likeを使用する方法がある場合 UNIQUEのセマンティクス 確認してください。わかりません。

    できることは、値をVARBINARYとして保存することです。 :

    mysql> create table test_ws ( `value` varbinary(255) UNIQUE );
    Query OK, 0 rows affected (0.13 sec)
    
    mysql> insert into test_ws (`value`) VALUES ('a');
    Query OK, 1 row affected (0.08 sec)
    
    mysql> insert into test_ws (`value`) VALUES ('a ');
    Query OK, 1 row affected (0.06 sec)
    
    mysql> SELECT CONCAT( '(', value, ')' ) FROM test_ws;
    +---------------------------+
    | CONCAT( '(', value, ')' ) |
    +---------------------------+
    | (a)                       |
    | (a )                      |
    +---------------------------+
    2 rows in set (0.00 sec)
    

    並べ替えは代わりにバイト値で行われるため、この列でアルファベット順に並べ替えるようなことはしたくない方がよいでしょう。これは、ユーザーが期待することではありません(とにかく、ほとんどのユーザー)。

    別の方法は、MySQLにパッチを適用し、タイプNOPADの独自の照合を作成することです。誰かがそれをしたいかどうかはわかりませんが、もしそうなら、私に知らせてください;)

    編集:一方、によると、MySQLにはタイプNOPADの照合があります。 https://dev.mysql.com/doc/refman/8.0/en/char.html

    および https://dev.mysql.com/ doc / refman / 8.0 / en / charset-unicode-sets.html

    したがって、試してみると:

      create table test_ws ( `value` varbinary(255) UNIQUE )
        character set utf8mb4 collate utf8mb4_0900_ai_ci;
    

    末尾の空白の有無にかかわらず値を挿入できます

    利用可能なすべてのPADなしの照合は次の場所で見つけることができます:

     show collation where Pad_attribute='NO PAD';
    


    1. Postgresql:接続が拒否されました。ホスト名とポートが正しいこと、およびポストマスターがTCP/IP接続を受け入れていることを確認してください

    2. 2つの行間の時間差を計算する

    3. MySQLでN:Mの関係を持つテーブルを作成するにはどうすればよいですか?

    4. mysqlの2つのタイムスタンプ間の時間差を計算します