提交 322068fe 编写于 作者: R Ryuta Kamizono

Remove `DEFAULT_CHARSET` and `DEFAULT_COLLATION` in `MySQLDatabaseTasks`

This reverts commit f6ca7e4e.

The default collation of utf8 in MySQL is the `utf8_general_ci`, and
this should not be changed. This is because, the better collation in the
all locales is not exists, optimal collation in own application is not
known other than themselves.

The `utf8_unicode_ci` is known as Japanese killer in Japan, there are
serious impacts in search of Japanese.

MySQL implements the `utf8_unicode_ci` according to the Unicode
Collation Algorithm (UCA) described at http://www.unicode.org/reports/tr10/,
but the `utf8_unicode_ci` have only partial support for the UCA, only
primary level key comparison implemented (also known as L1 (Base
characters) comparison).

Because L1 (Base characters) comparison does not distinguish between the
presence or absence of the accent, if distinction of the accent is
important there is a serious impact (e.g. Japanese).

Example:

```
> SHOW CREATE TABLE `dicts`\G
*************************** 1. row ***************************
       Table: dicts
Create Table: CREATE TABLE `dicts` (
  `word` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `meaning` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
1 row in set (0.00 sec)

> INSERT INTO `dicts` VALUES ('ハハ', 'mother'), ('パパ', 'father');
Query OK, 2 rows affected (0.00 sec)

> SELECT * FROM `dicts` WHERE `word` = 'ハハ';
+--------+---------+
| word   | meaning |
+--------+---------+
| ハハ   | mother  |
| パパ   | father  |
+--------+---------+
2 rows in set (0.00 sec)

> CREATE UNIQUE INDEX `unique_index_word` ON `dicts`(`word`);
ERROR 1062 (23000): Duplicate entry 'ハハ' for key 'unique_index_word'
```

We should omit the collation entirely rather than providing a default.
Then the choice is the responsibility of the server and MySQL distribution.
上级 10a80e39
* Remove `DEFAULT_CHARSET` and `DEFAULT_COLLATION` in `MySQLDatabaseTasks`.
We should omit the collation entirely rather than providing a default.
Then the choice is the responsibility of the server and MySQL distribution.
*Ryuta Kamizono*
* Alias `ActiveRecord::Relation#left_joins` to
`ActiveRecord::Relation#left_outer_joins`.
......
module ActiveRecord
module Tasks # :nodoc:
class MySQLDatabaseTasks # :nodoc:
DEFAULT_CHARSET = ENV['CHARSET'] || 'utf8'
DEFAULT_COLLATION = ENV['COLLATION'] || 'utf8_unicode_ci'
ACCESS_DENIED_ERROR = 1045
delegate :connection, :establish_connection, to: ActiveRecord::Base
......@@ -87,12 +85,6 @@ def creation_options
Hash.new.tap do |options|
options[:charset] = configuration['encoding'] if configuration.include? 'encoding'
options[:collation] = configuration['collation'] if configuration.include? 'collation'
# Set default charset only when collation isn't set.
options[:charset] ||= DEFAULT_CHARSET unless options[:collation]
# Set default collation only when charset is also default.
options[:collation] ||= DEFAULT_COLLATION if options[:charset] == DEFAULT_CHARSET
end
end
......
......@@ -21,28 +21,21 @@ def test_establishes_connection_without_database
ActiveRecord::Tasks::DatabaseTasks.create @configuration
end
def test_creates_database_with_default_encoding_and_collation
def test_creates_database_with_no_default_options
@connection.expects(:create_database).
with('my-app-db', charset: 'utf8', collation: 'utf8_unicode_ci')
with('my-app-db', {})
ActiveRecord::Tasks::DatabaseTasks.create @configuration
end
def test_creates_database_with_given_encoding_and_default_collation
@connection.expects(:create_database).
with('my-app-db', charset: 'utf8', collation: 'utf8_unicode_ci')
ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge('encoding' => 'utf8')
end
def test_creates_database_with_given_encoding_and_no_collation
def test_creates_database_with_given_encoding
@connection.expects(:create_database).
with('my-app-db', charset: 'latin1')
ActiveRecord::Tasks::DatabaseTasks.create @configuration.merge('encoding' => 'latin1')
end
def test_creates_database_with_given_collation_and_no_encoding
def test_creates_database_with_given_collation
@connection.expects(:create_database).
with('my-app-db', collation: 'latin1_swedish_ci')
......@@ -203,9 +196,9 @@ def test_establishes_connection_to_the_appropriate_database
ActiveRecord::Tasks::DatabaseTasks.purge @configuration
end
def test_recreates_database_with_the_default_options
def test_recreates_database_with_no_default_options
@connection.expects(:recreate_database).
with('test-db', charset: 'utf8', collation: 'utf8_unicode_ci')
with('test-db', {})
ActiveRecord::Tasks::DatabaseTasks.purge @configuration
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册