PHP mysql 土耳其语字符编码及比较

2024-05-04

我正在尝试通过 AJAX POST 从 MySql 数据库中过滤土耳其语姓名,英文字母单词列出一切正常,但是如果我发送 Ö (这是带点的字母 O),结果不仅是 Ö 还包括 O 和 Ö

另外我注意到 AJAX 帖子被发送 Ö 作为 %C3%96,有人可以帮忙吗?


请透露我有点冗长的回复。
让我们从你的第二个问题开始。%C3%96表示传输字节0xC3和0x96。这两个字节编码人物Ö以 utf-8 格式 http://www.fileformat.info/info/unicode/char/00d6/index.htm.
由此(并且您的查询产生所描述的结果)我假设您正在使用全程 utf-8 https://stackoverflow.com/questions/279170/utf-8-all-the-way-through.

The 字典顺序 https://en.wikipedia.org/wiki/Lexicographical_ordera 的字符数给定的字符集 http://www.joelonsoftware.com/articles/Unicode.html是由整理 http://dev.mysql.com/doc/refman/5.7/en/charset-literal.html used.
这或多或少是一个有序的字符列表。例如。 A、B、C、D……的含义A<B<C....
但这些列表可能在同一“位置”包含多个字符,例如
[A,A],B,C,D... 的意思是A==Ä->true

___ 短途旅行,与您的问题不直接相关 ____
我们来看看角色的“名字”Ö, it's LATIN CAPITAL LETTER O WITH DIAERESIS.
所以,基本字符是 O,它只是有一些装饰。
某些系统/库允许您指定比较的“粒度”/级别/强度,请参见例如整理者::设置强度 http://docs.php.net/manual/en/collator.setstrength.phpphp-intl 扩展名。

<?php
// utf8 characters
define('SMALL_O_WITH_DIAERESIS', chr(0xC3) . chr(0xB6));
define('CAP_O_WITH_DIAERESIS', chr(0xC3) . chr(0x96));

$coll = collator_create( 'utf-8' );
foreach( array('PRIMARY', 'SECONDARY', 'TERTIARY') as $strength) {
    echo $strength, "\r\n";
    $coll->setStrength( constant('Collator::'.$strength) );
    echo '  o ~ ö = ', $coll->compare('o', SMALL_O_WITH_DIAERESIS), "\r\n";
    echo '  Ö ~ ö = ', $coll->compare(CAP_O_WITH_DIAERESIS, SMALL_O_WITH_DIAERESIS), "\r\n";
}

prints

PRIMARY
  o ~ ö = 0
  Ö ~ ö = 0
SECONDARY
  o ~ ö = -1
  Ö ~ ö = 0
TERTIARY
  o ~ ö = -1
  Ö ~ ö = 1

在初级层面上,所有涉及的字符(o,O,ö,Ö)只是字符 O 的一些不相关的变体,因此所有字符都被视为相等。
在二级上,附加的“功能”WITH DIAERESIS被考虑在内,并且在第三级上还考虑它是小写字母还是大写字母。
但是...MySQL 并不完全是这样工作的...所以,再次抱歉;-)
___ 旅行结束 ____

在 MySQL 中,有指定顺序的排序规则表。当您选择一种字符集时,您还会隐式选择该字符集的默认排序规则,除非您明确指定一种排序规则。在您的情况下,隐式选择的排序规则可能是utf8_general_ci http://collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html它对待 ö==o。
这适用于表定义和连接的字符集/排序规则(后者与您的情况几乎无关)。
另一方面,utf8_turkish_ci 处理 ö!=o。这可能就是您想要的排序规则。

当你有一个像这样的表定义时

CREATE TABLE soFoo (
  x varchar(32)
)
CHARACTER SET utf8

选择 utf8 的默认排序规则 -> General_ci -> o=ö
您可以在定义表时指定表的默认排序规则

CREATE TABLE soFoo (
  x varchar(32)
)
CHARACTER SET utf8 COLLATE utf8_turkish_ci

由于您已经有一个表和数据,因此您可以更改表的排序规则...但是如果您在表级别执行此操作,则必须使用ALTER TABLE ... CONVERT http://dev.mysql.com/doc/refman/5.7/en/alter-table.html(如果您使用 MODIFY,该列将保留其“原始”排序规则)。

ALTER TABLE soFoo CONVERT TO CHARACTER SET utf8 COLLATE utf8_turkish_ci

这应该可以解决你的问题。


作为旁注,有(如上所述)分配给您的连接的排序规则 https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html以及。选择字符集意味着选择排序规则。我主要用PDO http://docs.php.net/pdo当(直接)连接到 MySQL 时,我的默认连接代码如下所示

$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false,
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));

请注意charset=utf8;没有排序规则,因此再次将 generic_ci 分配给该连接。这就是为什么

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
    PDO::ATTR_EMULATE_PREPARES=>false,
    PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
    PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
));

$smallodiaresis_utf8 = chr(0xC3) . chr(0xB6);
foreach( $pdo->query("SELECT 'o'='$smallodiaresis_utf8'") as $row ) {
    echo $row[0];
}

prints 1意思是o==ö。语句中使用的字符串文字被视为 utf8/utf8_general_ci。

我可以在语句中显式指定字符串文字的排序规则

SELECT 'o' COLLATE utf8_turkish_ci ='ö'

(仅将其设置为两个文字/操作数之一;有关其工作原理和原理的信息,请参阅表达式的整理 https://dev.mysql.com/doc/refman/5.7/en/charset-collation-expressions.html)
或者我可以通过设置连接排序规则

$pdo->exec("SET collation_connection='utf8_turkish_ci'");

两者都导致

foreach( $pdo->query("SELECT 'o'[...]='$smallodiaresis_utf8'") as $row ) {
    echo $row[0];
}

印刷0.

编辑:并使事情变得更加复杂:
字符集utf8不能代表all可能的字符。有更广泛的字符集utf8mb4 https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP mysql 土耳其语字符编码及比较 的相关文章

  • 在一个后台为MYSQL的网站上集成搜索

    我有一个位置搜索website http www jammulinks com对于一个城市 我们首先收集该城市所有可能类别的数据 如学校 学院 百货商店等 并将其信息存储在单独的表中 因为每个条目除了名称 地址和电话号码外都有不同的详细信息
  • JavaScript 中带前导零的数字发生变化

    我使用 print 语句从 php 调用 javascript 函数来打印 html 代码 并且传入一个整数 但是 在 php 中传递的值与 javascript 函数接收到的数字不匹配 我不知道为什么 这是调用 javascript 函数
  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • 将数据库中的用户 ID 添加到 Codeigniter 中的会话数据中?

    我是 CodeIgniter 的新手 在从数据库添加用户 ID 用户登录后 到会话数据时遇到问题 这是我的代码问题 之前可能会在 SOF 上被问到 在付出了所有努力之后 我问这个 登录模型
  • 尝试获取 Google accessToken

    看起来 无论我做什么 谷歌都在竭尽全力阻止我完成这个研究项目 我的项目让我使用 Google 电子表格作为数据库 并使用所述电子表格中的数据执行程序化的 Google 图片搜索 并向最终用户显示一些结果 设置说明 我开始按照此处的说明进行操
  • 如何在 Smarty 中打印 json

    我从 api 获取 json 如何使用 Smarty 打印 json Json格式 first name jinu last name mk loginid email protected cdn cgi l email protectio
  • 重新排列数组键 php [重复]

    这个问题在这里已经有答案了 我有这个数组 Array 15 gt 13 1 16 gt Mark one answer 19 gt You see a car on the hard shoulder of a motorway with
  • 经典的asp字符编码

    我在经典 asp 网站中遇到西班牙字符问题 用户可以在 aspx 页面上的表单中提交他们的姓名 地址 然后 aspx 页面将 ajax post 发送到经典的 asp 页面 它所做的所有操作都存储在我们的 Sql 2008 DB 中 我可以
  • 具有更改用户代理上下文的 file_get_contents 不起作用

    我正在尝试获取页面的阅读数和点赞数 网址是 https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg https mp weixin qq com s NPavBeHc8VdWXeSL6kfLRg 您必
  • 如何解决 Laravel 8 UI 分页问题?

    我在尝试最近发布的 laravel 8 时遇到了问题 我试图找出变化是什么以及它是如何工作的 当我这样做时 我遇到了分页 laravel 8 UI 变得混乱的问题 不知何故它发生了 有人可以帮助我吗 或者经历过同样的事情 像这样我在 lar
  • MySQL 数据库无法在 XAMPP for Mac 上启动

    突然我在 mac 上遇到了这个问题 我无法启动我的 MySQL 数据库 我只能启动 ProFTPD 和 Apache Web Server 这是应用程序日志 Starting all servers Starting MySQL Datab
  • magento成功页面变量

    我正在尝试捕获一些 magento 成功页面变量以传递给我们的广告公司 到目前为止 我已经得到了这个 但变量没有输出任何内容 数据需要采用以下格式 price1 price2 price3 qty1 qty2 qty3 sku1 sku2
  • 简单的dom php解析获取自定义数据属性值

    HTML div class something ddsf PHP foreach dom gt find something data rel as this var dump this gt attr 我尝试了这个但错误 在其文档中找不
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • HTML 代码中的 PHP [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我用 HTML 代码编写了 PHP div div 但这出现在输出页面中 else print 我怎样才能让PHP执行 你的文件有一个 p
  • 合并 url 中的 2 个输入值

    我有这样的形式
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • 在同一查询中选择 Count of ip 和 Count of DISTINCT ip

    我有一个这样的表结构 TABLE NAME counter id datetime url ip 1 2013 04 12 13 27 09 url1 ip01 2 2013 04 13 10 55 43 url2 ip02 3 2013
  • 如何在 PHP 中从字符串类名实例化? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何创建返回方法名称的新实例 不幸的是我收到这个错误 错误 类名必须是有效的对象或字符串 这是我的代码 class Foo public f
  • 如何使用配置文件 (.ebextensions) 在 AWS Elastic Beanstalk 上安装 PHP IMAP 扩展?

    有谁知道如何使用配置文件 ebextensions 在 AWS Elastic Beanstalk 上安装和启用 PHP IMAP 扩展 我使用的是 64 位 Amazon Linux 2017 03 v2 4 0 运行 PHP 7 0 1

随机推荐