|
Administrator
Join Date: Jun 2004
Posts: 383
|
Re: 1.8.7.3 Open Bugs and Design Deficiencies in MySQL
continued...
The following problems are known and will be fixed in due time:
- Log file names are based on the server hostname (if you don't specify a filename with the startup option). For now you have to use options like --log-bin=old_host_name-bin if you change your hostname to something else. Another option is to just rename the old files to reflect your hostname change. See section 5.2.1 mysqld Command-Line Options.
- mysqlbinlog will not delete temporary files left after a LOAD DATA INFILE command. See section 8.5 The mysqlbinlog Binary Log Utility.
- RENAME doesn't work with TEMPORARY tables or tables used in a MERGE table.
- When using the RPAD() function in a query that has to be resolved by using a temporary table, all resulting strings will have rightmost spaces removed. This is an example of such a query: SELECT RPAD(t1.column1, 50, ' ') AS f2, RPAD(t2.column2, 50, ' ') AS f1FROM table1 as t1 LEFT JOIN table2 AS t2 ON t1.record=t2.joinIDORDER BY t2.record;The final result of this bug is that you will not be able to get spaces on the right side of the resulting values. The problem also occurs for any other string function that adds spaces to the right. The reason for this is due to the fact that HEAP tables, which are used first for temporary tables, are not capable of handling VARCHAR columns. This behavior exists in all versions of MySQL. It will be fixed in one of the 4.1 series releases.
- Due to the way table definition files are stored, you cannot use character 255 (CHAR(255)) in table names, column names, or enumerations. This is scheduled to be fixed in version 5.1 when we have new table definition format files.
- When using SET CHARACTER SET, you can't use translated characters in database, table, and column names.
- You can't use `_' or `%' with ESCAPE in LIKE ... ESCAPE.
- If you have a DECIMAL column in which the same number is stored in different formats (for example, +01.00, 1.00, 01.00), GROUP BY may regard each value as a different value.
- You cannot build the server in another directory when using MIT-pthreads. Because this requires changes to MIT-pthreads, we are not likely to fix this. See section 2.3.5 MIT-pthreads Notes.
- BLOB values can't ``reliably'' be used in GROUP BY or ORDER BY or DISTINCT. Only the first max_sort_length bytes are used when comparing BLOB values in these cases. The default value of max_sort_length value is 1024. It can be changed at server startup time. A workaround for most cases is to use a substring. For example: SELECT DISTINCT LEFT(blob_col,2048) FROM tbl_name.
- Numeric calculations are done with BIGINT or DOUBLE (both are normally 64 bits long). Which precision you get depends on the function. The general rule is that bit functions are done with BIGINT precision, IF and ELT() with BIGINT or DOUBLE precision, and the rest with DOUBLE precision. You should try to avoid using unsigned long long values if they resolve to be bigger than 63 bits (9223372036854775807) for anything other than bit fields. MySQL Server 4.0 has better BIGINT handling than 3.23.
- All string columns, except BLOB and TEXT columns, automatically have all trailing spaces removed when retrieved. For CHAR types, this is okay. The bug is that in MySQL Server, VARCHAR columns are treated the same way.
- You can have only up to 255 ENUM and SET columns in one table.
- In MIN(), MAX(), and other aggregate functions, MySQL currently compares ENUM and SET columns by their string value rather than by the string's relative position in the set.
- mysqld_safe redirects all messages from mysqld to the mysqld log. One problem with this is that if you execute mysqladmin refresh to close and reopen the log, stdout and stderr are still redirected to the old log. If you use --log extensively, you should edit mysqld_safe to log to `host_name.err' instead of `host_name.log' so that you can easily reclaim the space for the old log by deleting the old one and executing mysqladmin refresh.
- In the UPDATE statement, columns are updated from left to right. If you refer to an updated column, you get the updated value instead of the original value. For example, the following statement increments KEY by 2, not 1: mysql> UPDATE tbl_name SET KEY=KEY+1,KEY=KEY+1;
- You can refer to multiple temporary tables in the same query, but you cannot refer to any given temporary table more than once. For example, the following doesn't work: mysql> SELECT * FROM temp_table, temp_table AS t2;ERROR 1137: Can't reopen table: 'temp_table'
- The optimizer may handle DISTINCT differently when you are using ``hidden'' columns in a join than when you are not. In a join, hidden columns are counted as part of the result (even if they are not shown), whereas in normal queries, hidden columns don't participate in the DISTINCT comparison. We will probably change this in the future to never compare the hidden columns when executing DISTINCT. An example of this is: SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;and SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;In the second case, you might in MySQL Server 3.23.x get two identical rows in the result set (because the values in the hidden id column may differ). Note that this happens only for queries where you don't have the ORDER BY columns in the result.
- Because MySQL Server allows you to work with table types that don't support transactions, and thus can't roll back data, some things behave a little differently in MySQL Server than in other SQL servers. This is just to ensure that MySQL Server never needs to do a rollback for an SQL statement. This may be a little awkward at times because column values must be checked in the application, but this will actually give you a nice speed increase because it allows MySQL Server to do some optimizations that otherwise would be very hard to do. If you set a column to an incorrect value, MySQL Server will, instead of doing a rollback, store the ``best possible value'' in the column. For information about how this occurs, see section 1.8.6 How MySQL Deals with Constraints.
- If you execute a PROCEDURE on a query that returns an empty set, in some cases the PROCEDURE will not transform the columns.
- Creation of a table of type MERGE doesn't check whether the underlying tables are of compatible types.
- If you use ALTER TABLE first to add a UNIQUE index to a table used in a MERGE table and then to add a normal index on the MERGE table, the key order will be different for the tables if there was an old key that was not unique in the table. This is because ALTER TABLE puts UNIQUE indexes before normal indexes to be able to detect duplicate keys as early as possible.
The following are known bugs in earlier versions of MySQL:
- In the following case you can get a core dump:
- Delayed insert handler has pending inserts to a table.
- LOCK TABLE with WRITE.
- FLUSH TABLES.
- Before MySQL Server 3.23.2, an UPDATE that updated a key with a WHERE on the same key may have failed because the key was used to search for records and the same row may have been found multiple times: UPDATE tbl_name SET KEY=KEY+1 WHERE KEY > 100;A workaround is to use: UPDATE tbl_name SET KEY=KEY+1 WHERE KEY+0 > 100;This will work because MySQL Server will not use an index on expressions in the WHERE clause.
- Before MySQL Server 3.23, all numeric types were treated as fixed-point fields. That means that you had to specify how many decimals a floating-point field should have. All results were returned with the correct number of decimals.
For information about platform-specific bugs, see the installation and porting instructions in section 2.6 Operating System-Specific Notes and section D Porting to Other Systems.
|