草庐IT

php - 去除带有外国口音的 MySQL 查询

coder 2023-10-12 原文

我必须承认我对php一无所知,而且我现在的脚本是继承的......

它使用 city 名称查询 MySQL 数据库,并返回它找到的该 city 的所有实例。

我有几个问题:第一个与连字符有关(例如 Stratford-upon-Avon);已通过添加

解决
$searchq = str_replace( '-', ' ', $searchq );

它允许我在不带连字符的情况下在数据库中输入数据。

我剩下的问题与外国口音有关(特别是:尖音、重音、抑扬音、cedille、tilde)。我尝试了上百万个函数,其中很多是我在这个网站上找到的,但没能成功。

我当前页面的主要php代码是这样的

$searchq = filter_var("%{$_POST['keyword']}%", FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH); // Sanitize the string

$searchq = str_replace( '-', ' ', $searchq );

$sql = "SELECT Image, Chain, Country, City, Top as '', Medium as '', Low as '' FROM Chains WHERE Country LIKE ? OR City LIKE ?"; // Your query string

$prepare = $mysqli->prepare($sql); // Prepare your query string
$prepare->bind_param('ss', $searchq, $searchq); // Bind the placeholders to your search variables
// s = string | i = integer | d = double | b = blob
$prepare->execute(); // Execute the prepared statement
$prepare->store_result(); // Store the results for later checking

我一直避免来这个论坛,因为我知道它是为高级开发人员准备的,而我不是他们中的一员......

以上代码所做的只是删除重音字母,而不是用没有重音的相同字母替换它

编辑

如何再次引起 Ollie Jones 的注意?

我卡住了,不知道如何处理脚本部分

另一个编辑 当我在表 SQL 中输入这个时

ALTER TABLE Chains CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8_general_ci;

我收到此警告但什么也没做...

#1253 - COLLATION 'utf8_general_ci' 对 CHARACTER SET 'utf8mb4' 无效

最佳答案

MySQL 的字符集和排序规则功能旨在正确处理此类事情,而不需要额外的搜索列。

例如,观察这个小查询:

select _utf8'résumé' COLLATE utf8_general_ci = _utf8'resume'

或者,使用更现代的 utf8mb4 字符集,

select _utf8mb4'résumé' COLLATE utf8mb4_general_ci = _utf8mb4'resume'

这两个查询都发现 résuméresume 是相等的。它适用于几乎所有带有欧洲语言重音的字符。

这些查询包含两个显式创建为 unicode 字符串的字符串常量。然后使用case_insensitive 排序规则对它们进行比较。在该排序规则中,e-acute 和 e-grave 的大写和小写形式都被认为是相同的。

如何让它与您的数据库一起使用?

  1. 确保地名列(CityCountry)的字符集设置为 utf8 或更好然而,更健壮和现代的 utf8mb4

  2. 确保这些表的默认排序规则是您选择的字符集的不区分大小写的排序规则。

  3. 只做您的查询。你不需要任何特别的东西。例如,WHERE City = 'Sèvres'WHERE City = 'sevres' 将产生相同的结果。这非常适合习惯于使用 Google 类型搜索的用户。

在更改表格之前先备份一份,以防万一你搞砸了。

CREATE TABLE chains_backup SELECT * FROM chains

然后使用这种命令来更改表中的列。

  alter table chains
       modify City  varchar(255)
                    character set utf8mb4
                    collate utf8mb4_general_ci

您需要使用列的实际数据类型来代替 varchar(255)。你没有告诉我们那是什么,所以我猜。

您为每个列选择的默认排序规则已嵌入到索引中。因此,您对变音符号不敏感的搜索不仅会准确,而且会很快。

请注意,西类牙语 ñ 是一种奇怪的情况。对于一般排序规则,ñn 是相等的。但在西类牙语词典中,ñ 是一个不同的字母。因此,如果您想要按字母顺序排列的西类牙地名,您需要 utf8_spanish_ciutf8mb4_spanish_ci 排序规则。

您问题中显示的代码的好消息是:当您使用不区分大小写的排序规则时,您根本不需要 just_clean 函数。

您可能希望使用 WHERE City LIKE 'stratford%' 而不是 WHERE City = 'stratford' 进行搜索——这将使您的查询匹配第一个搜索词的几个字符。 LIKE 构造将匹配 Stratford-upon-Avon 以及 Stratfordshire

关于php - 去除带有外国口音的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34238742/

有关php - 去除带有外国口音的 MySQL 查询的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  4. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  5. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

  6. Ruby:如何使用带有散列的 'send' 方法调用方法? - 2

    假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而

  7. ruby-on-rails - 带有 Pry 的 Rails 控制台 - 2

    当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question

  8. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

  9. ruby-on-rails - 无法安装 mysql2 0.3.14 gem - 2

    我看到其他人也遇到过类似的问题,但没有一个解决方案对我有用。0.3.14gem与其他gem文件一起存在。我已经完全按照此处指示完成了所有操作:https://github.com/brianmario/mysql2.我仍然得到以下信息。我不知道为什么安装程序指示它找不到include目录,因为我已经检查过它存在。thread.h文件存在,但不在ruby​​目录中。相反,它在这里:C:\RailsInstaller\DevKit\lib\perl5\5.8\msys\CORE\我正在运行Windows7并尝试在Aptana3中构建我的Rails项目。我的Ruby是1.9.3。$gemin

  10. ruby-on-rails - solr 清理查询 - 2

    我在Rails上使用带有ruby​​的solr。一切正常,我只需要知道是否有任何现有代码来清理用户输入,比如以?开头的查询。或* 最佳答案 我不知道执行此操作的任何代码,但理论上可以通过查看parsingcodeinLucene来完成并搜索thrownewParseException(只有16个匹配!)。在实践中,我认为您最好只捕获代码中的任何solr异常并显示“无效查询”消息或类似信息。编辑:这里有几个“sanitizer”:http://pivotallabs.com/users/zach/blog/articles/937-s

随机推荐