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

PHP mysql土耳其语字符编码与比较,php,mysql,character-encoding,Php,Mysql,Character Encoding,我试图通过AJAX POST从MySql数据库中过滤土耳其名字,英文字母单词列出的都是OK,但是如果我发送Ö(带点的字母O),结果是O和Ö,而不仅仅是Ö 我还注意到AJAX帖子是以%C3%96的形式发送的,任何人都可以帮忙吗?请说出我有点冗长的回复。 让我们从你的第二个问题开始%C3%96表示传输字节0xC3和0x96。这两个字节进行编码。 根据这一点(并且您的查询会产生所描述的结果),我假设您正在使用 字符的长度由所使用的字符决定。 这或多或少是一个有序的字符列表。例如A、B、C、D等,。。。

我试图通过AJAX POST从MySql数据库中过滤土耳其名字,英文字母单词列出的都是OK,但是如果我发送Ö(带点的字母O),结果是O和Ö,而不仅仅是Ö


我还注意到AJAX帖子是以%C3%96的形式发送的,任何人都可以帮忙吗?

请说出我有点冗长的回复。
让我们从你的第二个问题开始<代码>%C3%96表示传输字节0xC3和0x96。这两个字节进行编码。
根据这一点(并且您的查询会产生所描述的结果),我假设您正在使用

字符的长度由所使用的字符决定。
这或多或少是一个有序的字符列表。例如A、B、C、D等,。。。。意思是
A通用的\u ci->o=ö
定义表时,可以指定表的默认排序规则

CREATE TABLE soFoo (
  x varchar(32)
)
CHARACTER SET utf8 COLLATE utf8_turkish_ci
因为您已经有了一个表和数据,所以您可以更改表的排序规则……但是如果您在必须使用的表级别进行更改(如果您使用MODIFY,则列将保留其“原始”排序规则)

这应该可以解决你的问题


作为旁注,还有(如上所述)a。选择字符集意味着选择排序规则。我主要在(直接)连接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
;没有排序规则,因此再次将常规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];
}
(仅为两个文字/操作数中的一个设置它;有关此操作的原因和方式,请参见)
或者我可以通过设置连接排序规则

$pdo->exec("SET collation_connection='utf8_turkish_ci'");
两者都会导致

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

编辑:让事情更复杂一点:

字符集utf8不能代表所有可能的字符。还有更广泛的字符集。

PHP代码应该接收到
%C3%96
适当解码回
Ö
。但如果没有,则将PHP函数
urldecode()
应用于字符串

您仍将使用字符
Ö
,而不是
O
;可以吗

如果你得到
Ö
,那么就混合了utf8和拉丁语1。这是另一个问题

$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
));
<?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];
}
SELECT 'o' COLLATE utf8_turkish_ci ='ö'
$pdo->exec("SET collation_connection='utf8_turkish_ci'");
foreach( $pdo->query("SELECT 'o'[...]='$smallodiaresis_utf8'") as $row ) {
    echo $row[0];
}