gpt4 book ai didi

php - 对每个查询使用不同的排序规则

转载 作者:行者123 更新时间:2023-12-04 07:22:46 24 4
gpt4 key购买 nike

我有一个名为“名称”的表:

CREATE TABLE names (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
sex TINYINT UNSIGNED,
canon BIT(1) NOT NULL DEFAULT FALSE
UNIQUE KEY uk_names (name, sex)
) ENGINE=InnoDB,
CHARACTER SET utf8,
COLLATE utf8_bin ;
其中包含一堆法语名称。由于它们是法语,因此其中许多都包含变音符号(é、à、è、ù、ï、ö、ü、â、ê、î、ô、û 和ç)。因此,例如,名称 Leia、Léia、Leïa 和 Léïa 都被认为是不同的名称,并且在 MySQL 眼中是独一无二的。
这是 究竟应该如何为了我的目的。
但是,当我运行诸如(只是一个简化示例)之类的查询时:
SELECT * FROM names WHERE name = 'Leia'
我得到一行,对应于没有任何变音符号的确切拼写“Leia”。
或者,如果我运行此查询:
SELECT * FROM names WHERE name LIKE '%Helene%'
我可能会得到“Helene”和“Marie-Hélene”的名字,但不会得到“Hélène”和“Marie-Hélène”的名字。
这是 有时 正是我想要的。有时我需要搜索一个准确的名字,拼写准确。但其他时候我想得到一个名字的所有变体拼写。
据我所知,这与我选择的排序规则( utf8_bin )有关。据我了解,如果我希望所有变体拼写匹配,我需要 utf8_unicode_ci反而。那是对的吗?
但是,如果我尝试更改我的表以使用 utf8_unicode_ci ,我收到一条错误消息,指出由于我的唯一约束存在重复的行。这表明更改表本身的排序规则(并删除唯一约束来这样做)会给我带来相反的问题:无法查找名称的准确拼写。
那么如何为每个单独的查询即时选择排序规则?
我尝试在查询之前运行它:
SET NAMES utf8 COLLATE utf8_unicode_ci
但这似乎没有任何作用,在我看到的关于 SET NAMES 的各种答案中它似乎暗示你无论如何都不应该使用它(它会导致安全问题?)
顺便说一句,我使用 DSN mysql:host=...;dbname=...;charset=utf8 在 PHP(使用 PDO)中连接到我的数据库以防万一。
我似乎能想到的唯一解决方案是创建一个名称的所有可能的替代拼写列表(可能在 PHP 中),然后运行如下:
SELECT * FROM names WHERE name IN ('Leia', 'Léia', 'Leïa', 'Léïa')
但是由于有很多变音符号,对于某些名字(弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦、弗朗索瓦……等等)来说,它似乎可能会变得很安静。 .我知道其中一些拼写实际上并不存在,但是如果不针对数据库测试所有可能性,我的脚本将无法知道哪些拼写)。
当然有一种更简单、更优雅的方式来做我想做的事吗?

最佳答案

您必须使用此查询:

SELECT * FROM names WHERE name LIKE _utf8'%Leia%' collate utf8_general_ci;

关于php - 对每个查询使用不同的排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68390035/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com