PostgreSQL模式匹配查询不按预期工作

12 浏览
0 Comments

PostgreSQL模式匹配查询不按预期工作

我查看了一些内容,但没有找到我想要的,所以我试试看。

SELECT * FROM trees WHERE trees.`title` LIKE  '%elm%'

这个可以正常工作,但如果树的名称是Elm或ELM等,就不行了...

如何使SQL在通配符搜索中不区分大小写?

我使用的是MySQL 5和Apache。

0
0 Comments

问题原因:问题出现在PostgreSQL模式匹配查询中。根据数据库的大小写敏感设置,查询结果可能与预期不符。

解决方法:可以通过在查询中指定特定的大小写敏感设置来解决该问题。例如,使用以下方式进行查询:SELECT * FROM trees WHERE trees.`title` LIKE '%elm%' COLLATE utf8_general_ci(将utf8_general_ci替换为你认为有用的大小写敏感设置)。在这里,_ci代表不区分大小写

在MySQL 5.6版本中,可能会出现ERROR 1273 (HY000): Unknown collation: 'utf_general_ci'的错误。这可能是因为MySQL中已删除了该排序规则(collation)。虽然utf8_general_ci可以正常工作。

如果遇到相同的问题,可以修复COLLATE,或者在比较之前对两个字符串都使用LOWER()函数进行转换。

在MySQL 5.6+或MariaDB 10+中,只需在条件之前提供COLLATE指令即可。例如:SELECT * FROM products WHERE name COLLATE utf8_general_ci LIKE 'AB47TU';

0
0 Comments

问题出现的原因是在PostgreSQL中使用模式匹配查询时,使用了MySQL的语法和函数。MySQL中的COLLATE和ILike函数在PostgreSQL中是无效的,因此查询无法按预期工作。

解决方法是使用PostgreSQL中的ILike函数来进行模式匹配查询。ILike函数是PostgreSQL中用于执行不区分大小写的模式匹配的函数。

以下是解决方法的示例代码:

SELECT  *
FROM    trees
WHERE   trees.`title` ILike '%elm%'

如果想要在列的定义中添加COLLATE UTF8_GENERAL_CI,可以使用以下语句来修改表的列定义:

ALTER TABLE trees 
MODIFY COLUMN title VARCHAR(…) CHARACTER 
SET UTF8 COLLATE UTF8_GENERAL_CI

这将重建该列上的任何索引,以便可以在没有前导“%”的查询中使用它们。

另外,需要注意的是,在PostgreSQL中使用UTF8编码时,应该使用UTF8MB4而不是MySQL的UTF8编码。MySQL的UTF8编码是有问题的,并且最多只支持3个字节,而真正的UTF8编码支持最多4个字节。因此,在使用PostgreSQL时,应该使用UTF8MB4编码来表示UTF8编码。

以上就是解决PostgreSQL模式匹配查询不按预期工作的原因和解决方法。通过使用PostgreSQL的ILike函数和正确的编码方式,可以正确地执行模式匹配查询。

0
0 Comments

PostgreSQL模式匹配查询结果不如预期的原因可能是因为MySQL和PostgreSQL在处理大小写敏感性的方式上有所不同。在MySQL中,默认情况下,字符串比较是不区分大小写的,但是在匹配模式时是区分大小写的。而在PostgreSQL中,默认情况下,字符串比较和匹配模式都是区分大小写的。

解决这个问题的方法是使用LOWER函数将字符串转换为小写,然后再进行匹配查询。这样可以确保不论数据库是大小写敏感还是不敏感,都能得到正确的结果。例如,在PostgreSQL中可以这样查询:

SELECT * FROM trees WHERE LOWER(trees.title) LIKE '%elm%'

另一种解决方案是创建一个额外的列,将目标字段已经转换为小写(或大写)的形式,并在该列上创建索引。这样可以提高对不区分大小写的搜索的性能。不过,这种方法会导致数据库的冗余,因为需要额外的列来存储转换后的值。

需要注意的是,使用LOWER函数或创建额外的列都有一些问题。其中,使用LOWER函数可能会导致查询变慢,特别是对于大量数据的情况。另外,对于包含二进制数据(如序列化数据)的列,LOWER函数是不起作用的。关于LOWER和UPPER函数的其他问题,可以参考Jon Skeet在Stack Overflow上的帖子。

解决PostgreSQL模式匹配查询不如预期的问题可以通过使用LOWER函数或创建额外的转换列来实现。但是需要注意这些方法可能会带来一些性能或其他方面的问题。

0