Django和mariadb无法使用德语变音符号正确使用istartswith

时间:2018-07-03 14:21:45

标签: django mariadb

以下查询应仅返回以“Ö”(德语为umlaut)开头的所有城市。

letter = 'Ö'
City.objects.filter(name__istartswith=letter)

但是它返回以O和Ö开头的城市。

我使用Django 1.11和mariadb。 我已经在该表上将COLLATE设置为utf8_bin,但这并没有改变Django中的行为。

这是简化的SQL查询

SELECT `cities_city`.`name` FROM `cities_city` WHERE `cities_city`.`name` LIKE "Ö%";

,这里是SHOW CREATE TABLE输出:

SHOW CREATE TABLE `cities_city`
    -> ;
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| cities_city | CREATE TABLE `cities_city` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) CHARACTER SET utf8 NOT NULL,
  `slug` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `name_std` varchar(200) CHARACTER SET utf8 NOT NULL,
  `location` point NOT NULL,
  `population` int(11) NOT NULL,
  `elevation` int(11) DEFAULT NULL,
  `kind` varchar(10) CHARACTER SET utf8 NOT NULL,
  `timezone` varchar(40) CHARACTER SET utf8 NOT NULL,
  `country_id` int(11) NOT NULL,
  `region_id` int(11) DEFAULT NULL,
  `subregion_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `cities_city_country_id_2f07e352_uniq` (`country_id`,`region_id`,`subregion_id`,`id`,`name`),
  KEY `cities_city_b068931c` (`name`),
  KEY `cities_city_16c3f481` (`name_std`),
  KEY `cities_city_region_id_0227cdac_fk_cities_region_id` (`region_id`),
  KEY `cities_city_subregion_id_9fbab97d_fk_cities_subregion_id` (`subregion_id`),
  CONSTRAINT `cities_city_country_id_779ae117_fk_cities_country_id` FOREIGN KEY (`country_id`) REFERENCES `cities_country` (`id`),
  CONSTRAINT `cities_city_region_id_0227cdac_fk_cities_region_id` FOREIGN KEY (`region_id`) REFERENCES `cities_region` (`id`),
  CONSTRAINT `cities_city_subregion_id_9fbab97d_fk_cities_subregion_id` FOREIGN KEY (`subregion_id`) REFERENCES `cities_subregion` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11468436 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

1 个答案:

答案 0 :(得分:1)

问题是一个细微的问题。

线索在这里:

SELECT * FROM information_schema.`COLUMNS` WHERE table_name = 'cities_city';

说明...

`name` varchar(200) CHARACTER SET utf8 NOT NULL,

COLLATE utf8_general_ci,因为这是utf8的默认排序规则。

此表默认

) ENGINE=InnoDB AUTO_INCREMENT=11468436 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

utf8_bin分配给任何新添加的行

也许您做了明显的ALTER TABLE更改为_bin?相反:

ALTER TABLE cities_city
    CONVERT TO CHARACTER SET utf8
               COLLATE       utf8_bin;

这将进入每个字符串列并进行更改。请注意,排序规则更改时必须重建索引(等)。