WL#3792: BINARY and VARBINARY changes
Affects: Server-7.1
—
Status: Un-Assigned
SQL:2008, the replacement for the SQL:2003 standard, has a new non-core feature: Feature T021, "BINARY and VARBINARY data types". MySQL will make some changes to its existing support for BINARY/VARBINARY when the standard is out.
Data types ---------- For a long time, there was controversy whether BINARY/VARBINARY were data types, or merely variants of CHAR/VARCHAR data types. The decision, finally, was that BINARY and VARBINARY are data types. The SQL:200x document says that they are data types. There will be no change. Padding 0x00 for comparison --------------------------- With CHAR/VARCHAR, 'A '= 'A'. That is, all collations are "pad space"; in effect MySQL adds spaces to the end of the shorter string before comparing. The question arose: for BINARY/VARBINARY, should there be 0x00 padding? If so, X'01' = X'0100'. If not, X'01' < X'0100'. The decision was: X'01' < X'0100'. There is no padding for BINARY/VARBINARY. For example, this is MySQL current behaviour: mysql> create table tb (s1 binary(5)); Query OK, 0 rows affected (0.01 sec) mysql> insert into tb values (X'01'); Query OK, 1 row affected (0.01 sec) mysql> select count(*) from tb where s1 = X'01'; +----------+ | count(*) | +----------+ | 0 | +----------+ 1 row in set (0.35 sec) The SQL:200x document says that such behaviour is "implementation-defined". There will be no change. Truncating 0x00 for assignment ------------------------------- Currently, if one tries to assign X'0100' to a one-byte BINARY/VARBINARY target (that is, the value is longer than the maximum due to trailing 0x00 bytes), MySQL gives a warning in non-strict mode and an error in strict mode (if sql_mode=STRICT_TRANS_TABLES or STRICT_ALL_TABLES). For example, this is MySQL current behaviour: mysql> create table ta (s1 binary(5), s2 varbinary(5)); Query OK, 0 rows affected (0.01 sec) mysql> insert into ta values (X'010000000000',X'010000000000'); Query OK, 1 row affected, 2 warnings (0.00 sec) mysql> show warnings; +---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1265 | Data truncated for column 's1' at row 1 | | Warning | 1265 | Data truncated for column 's2' at row 1 | +---------+------+-----------------------------------------+ 2 rows in set (0.00 sec) mysql> set sql_mode=traditional; Query OK, 0 rows affected (0.00 sec) mysql> insert into ta values (X'010000000000',X'010000000000'); ERROR 1406 (22001): Data too long for column 's1' at row 1 The SQL:200x document says that such behaviour is wrong -- trailing X'00' bytes can be truncated without error. Compare what happens with inserting 'A ' into a CHAR(1) target -- MySQL doesn't give either warning or error for that. However, Alexander Barkov voted not to change MySQL's current behaviour. There will be no change. BINARY VARYING -------------- Currently MySQL allows only one way to describe a varyiable-length binary data type: VARBINARY. The SQL:200x document says: allow BINARY VARYING as a VARBINARY synonym. For comparison, there is a CHAR VARYING synonym for VARCHAR. There will be a change: MySQL will allow BINARY VARYING in definitions of columns and variables. The SQL:200x document says that one should see 'BINARY VARYING' (not 'VARBINARY') for data_type columns in information_schema. However, MySQL already says 'varchar' instead of 'CHARACTER VARYING', and already says 'varbinary' instead of 'BINARY VARYING'. There was no vote about this detail. There will be no change. Literals -------- Currently MySQL accepts [var]binary literals in the standard form: X'hh...' where hh... means pairs of hexadecimal digits, repeated indefinitely. For example, this is MySQL current behaviour: mysql> create table td as select x'01'; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> select data_type from information_schema.columns -> where table_name='td'; +-----------+ | data_type | +-----------+ | varbinary | +-----------+ 1 row in set (0.00 sec) The SQL:200x document says that binary literals may contain spaces, and may be combined. That is: X'ABCD' and X'AB' CD' are the same. And: X'ABCD' and X'AB CD' are the same. This is similar to what happens for other literals, see WL#3529 Unicode Escape Sequences. It is optional, not part of Feature T021. There will be a change: MySQL will allow such literals. References ---------- WL#3759 "Data types: BLOB/TEXT [VAR]CHAR/[VAR]BINARY should be different types" dev-private thread "BINARY and VARBINARY" https://intranet.mysql.com/secure/mailarchive/mail.php?folder=4&mail=18197 feature request: BUG#26799 Char and binary types without padding/stripping
Copyright (c) 2000, 2024, Oracle Corporation and/or its affiliates. All rights reserved.