cla*_*ion 8 mysql unicode collation utf-8 character-encoding
我正在使用Django Web应用程序将Unicode字符串存储在MySQL数据库中.我可以很好地存储Unicode数据,但是在查询时,我发现它é并被e视为它们是相同的字符:
In [1]: User.objects.filter(last_name='Jildén')
Out[1]: [<User: Anders Jildén>]
In [2]: User.objects.filter(last_name='Jilden')
Out[2]: [<User: Anders Jildén>]
Run Code Online (Sandbox Code Playgroud)
直接使用MySQL shell时也是如此:
mysql> select last_name from auth_user where last_name = 'Jildén';
+-----------+
| last_name |
+-----------+
| Jildén |
+-----------+
1 row in set (0.00 sec)
mysql> select last_name from auth_user where last_name = 'Jilden';
+-----------+
| last_name |
+-----------+
| Jildén |
+-----------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
以下是数据库字符集设置:
mysql> SHOW variables LIKE '%character_set%';
+--------------------------+------------------------------------------------------+
| Variable_name | Value |
+--------------------------+------------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/Cellar/mysql/5.1.54/share/mysql/charsets/ |
+--------------------------+------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
这是表模式:
CREATE TABLE `auth_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(30) CHARACTER SET utf8 NOT NULL,
`first_name` varchar(30) CHARACTER SET utf8 NOT NULL,
`last_name` varchar(30) CHARACTER SET utf8 NOT NULL,
`email` varchar(200) CHARACTER SET utf8 NOT NULL,
`password` varchar(128) CHARACTER SET utf8 NOT NULL,
`is_staff` tinyint(1) NOT NULL,
`is_active` tinyint(1) NOT NULL,
`is_superuser` tinyint(1) NOT NULL,
`last_login` datetime NOT NULL,
`date_joined` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=7952 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Run Code Online (Sandbox Code Playgroud)
以下是我通过Django DATABASES设置传递的选项:
DATABASES = {
'default': {
# ...
'OPTIONS': {
'charset': 'utf8',
'init_command': 'SET storage_engine=INNODB;',
},
},
}
Run Code Online (Sandbox Code Playgroud)
请注意,我已尝试将表格排序设置为utf8_bin,但不起作用:
mysql> alter table auth_user collate utf8_bin;
mysql> select last_name from auth_user where last_name = 'Jilden';
+-----------+
| last_name |
+-----------+
| Jildén |
+-----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我怎样才能让MySQL将它们视为不同的字符?
当你改变表格整理时,你几乎就在那里,但并不完全.在MySQL中,表中的每一列都有自己的字符集和排序规则.该表具有自己的字符集和排序规则,但这不会覆盖列排序规则; 它仅确定对于未指定排序规则的新列的排序规则.因此,您没有更改您感兴趣的列的排序规则.
ALTER TABLE tablename MODIFY columnname
varchar(???) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
Run Code Online (Sandbox Code Playgroud)
您需要设置一个将变音符号视为重要的排序规则.尝试使用utf8_bin
| 归档时间: |
|
| 查看次数: |
1990 次 |
| 最近记录: |