有没有办法忽略并接受整理?

Posted

技术标签:

【中文标题】有没有办法忽略并接受整理?【英文标题】:Is there a way to ignore and accept collate? 【发布时间】:2020-05-10 15:41:37 【问题描述】:

我的 SQL 请求有问题:

SELECT  CLCLEUNIK, NOM, VILLE, CODEP 
FROM CLIENT 
WHERE NOM LIKE :nom COLLATE French_CI_AI

就我而言,我使用整理是因为用户可以搜索“rhone”,它会找到“rhône”。但我的问题是,现在当有人搜索“Rhône”时,请求在我的数据库中找不到任何匹配项。


编辑: 这是基础的创建:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[CLIENT](


    [NOM] [varchar](50) NULL,
    [ADRESSE] [text] NULL,
    [CODEP] [varchar](5) NULL,
    [VILLE] [varchar](40) NULL,
    [TYPECLI] [int] NULL,
    [TEL] [varchar](20) NULL,



) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

这是php代码:

 public function searchCli(Request $request)
        require __DIR__.DIRECTORY_SEPARATOR."..".DIRECTORY_SEPARATOR."Entity".DIRECTORY_SEPARATOR."sqlconnect.php";


          $nom = $request->request->has("nom") ? $request->request->get("nom") : "";
          $nom = str_replace(" ", "%", $nom);


          $req ="SELECT  CLCLEUNIK, NOM, VILLE, CODEP FROM CLIENT WHERE NOM LIKE :nom COLLATE French_100_CI_AI";
          $prepare = $pdo->prepare($req);
          $prepare->execute(
            [
              "nom" => "%$nom%"
            ]
          );



          $clientsrecherche = $prepare->fetchAll(PDO::FETCH_OBJ);

          foreach($clientsrecherche as $key => $objet)
            foreach($objet as $key2 => $obj)
              $obj=utf8_encode($obj);
              $response[$key][$key2] = $obj;
            ;
                               
            return new JsonResponse([ "response" => $response]);
       

我只能帮忙

【问题讨论】:

您正在使用不区分大小写的排序规则,所以这应该可以工作...您能否发布一个最小的可重现示例? @NeoKerd 发布 reproducible 示例 - CREATE TABLE 语句、测试数据、查询。问题很可能是因为您使用 varchar 字符串,而不是排序规则。如果您使用带有错误代码页的varchar参数值本身可能在到达服务器之前就已经乱码 您必须使用COLLATE French_CI_AI 的事实本身就是一种强烈的气味,无论如何都是一个问题。即使没有转换错误,该语句也会阻止服务器使用任何索引。 Collat​​ion 的字面意思是排序顺序。索引取决于该排序顺序来决定哪些值是等价的,哪些值在哪个值之前。如果您必须使用与索引不同的排序规则,则索引将变得不可用 @NeoKerd 你怎么知道你有问题呢?不知何故,您运行一个查询并得到一个意想不到的结果。这意味着您已经知道预期实际结果是什么。您应该能够通过打开 SSMS 或 Azure Data Studio(本质上是用于数据库的 VS Code)来查看表的架构。右击表格选择Script生成创建脚本 @NeoKerd 这很重要的原因是varchar 表示带有代码页的文本。在 US-ASCII 范围之外,相同的字节值可以表示不同代码页中的不同字符。服务器将尝试将文本从客户端代码页转换为列的代码页。如果 client 代码页一开始是错误的,那么您最终会得到乱码。当您在打开 ASCII 文件时看到“奇怪”的文本,或者在需要重音字符时看到 ?? 字符时,就会发生这种情况 【参考方案1】:

更多说明:

排序规则属性:

CI 指定不区分大小写(不区分大小写的比较,因此 'ABC' 将等于 'abc')

CS 指定区分大小写

AS指定重音敏感(重音敏感,所以'ü'不等于'u')

AI 指定不区分重音

你可以试试French_100_CI_AI而不是French_CI_AI

【讨论】:

仍然无法工作,但感谢您的描述,很高兴知道 @NeoKerd ,你好,你应该使用French_100_CI_AIFrench_CI_AI,它们涵盖了所有情况。所以在 PHP 代码中找到你的问题

以上是关于有没有办法忽略并接受整理?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法只获取顶部元素的innerText(并忽略子元素的innerText)?

Jetty Websocket 连接 - 忽略自签名证书

有没有办法告诉gcc忽略“”?

Python - 解析文件需要帮助。有没有办法忽略 EOF 字符?

有没有办法让 Resharper 忽略未使用的引用?

npm install:有没有办法忽略 package.json 中的特定依赖项