更新MySQL表格时,使用非英语字符无法正常工作,排序规则和字符集都设置为utf8或utf8mb4。

12 浏览
0 Comments

更新MySQL表格时,使用非英语字符无法正常工作,排序规则和字符集都设置为utf8或utf8mb4。

我在尝试更新数据库时遇到了问题,我相信这与字符集/排序问题有关。我已经搜索了所有其他相关问题,更新了排序和字符集,尝试了一切,但似乎没有任何作用。

我的操作是从一些HTML中获取数据(经过网站所有者的许可),稍微处理一下,然后使用UPDATE将处理后的数据保存在我的表中。

我有一个字段reference,它是从HTML中获取的,更新操作会查找该字段,并在字段匹配时更新我的表。如果没有特殊(非英文)字符,它可以正常工作:

UPDATE database.table SET points = 100 WHERE reference = '皇家马德里'

如果reference中有任何非英文字符,那么如果我从我的PHP / HTML网站进行更新操作,则更新操作不起作用 - 如果我直接将查询放入phpmyadmin中,它可以正常工作:

UPDATE database.table SET points = 100 WHERE reference = '马德里竞技'

我尝试了每个非英文字符,不仅仅是é,所以这似乎是根本问题。

我获取的HTML最初是UTF-8,但是在某个时候,文本的编码似乎从纯粹的UTF-8变为ASCIIASCII不是UTF-8的一个子集吗?我不太确定这是否是问题,但编码不同,这很奇怪。

下面是我的代码,其中在不同的时间指出了编码:

$html = file_get_html('http://url.to.scrape');
// 此时,`mb_detect_encoding($html)`是UTF-8。
    $i = 1;
    while($i <= 20){
    foreach($html->find('tr') as $tableRow) {
      // 此时,`mb_detect_encoding($tableRow)`是`ASCII`
      $rowData['team'] = $tableRow->find('td', 0)->plaintext;
      // 此时,`mb_detect_encoding($rowData['team'])`是`ASCII`
      $rowData['points'] = $tableRow->find('td', 1)->plaintext;
      $points = $rowData['points'] * doSomeManipulationHere();
      $update_query = "UPDATE database.table SET points = $points WHERE reference = '". $rowData['team'] ."'";
      print_r($update_query);
    }
  }

如上所述,如果$rowData['team']不包含非英文字符,则可以正常工作。如果包含任何非英文字符,则无法正常工作。

再次说明,如果我print_r($update_query),并将输出的内容直接复制粘贴到phpmyadminSQL选项卡中,它可以按预期工作,即使包含é字符,这使我相信MySQL字符集/排序设置正确,问题出现在PHP / HTML / MySQL连接的某个地方。

我想我需要弄清楚为什么我的数据突然从UTF-8变为ASCII

我的设置:

MySQL服务器连接排序: utf8mb4_unicode_ci

MySQL表排序: utf8mb4_unicode_ci

MySQL字段排序: utf8mb4_unicode_ci

PHP默认字符集: UTF-8

HTML:

.htaccess / charset.confAddDefaultCharset UTF-8 (编辑:在最初发布后添加,感谢@asiri的建议)

我尝试了发送header('Content-Type: text/html; charset=utf-8');,但没有帮助。

当我在网站上查看这些字符时,也看到了可怕的黑色问号,所以肯定是某处的编码问题,只是我不知道是在哪里。

0
0 Comments

问题出现的原因:

- MySQL表的更新操作无法处理非英文字符。

- 字符集和校对规则已经设置为utf8或utf8mb4。

解决方法:

1. 尝试在.htaccess文件中设置编码:

AddDefaultCharset utf-8

将这行代码添加到放置代码的根目录下的.htaccess文件中。

2. 或者尝试在数据库连接中设置编码:

$link = mysqli_connect('localhost', 'user', 'password', 'database');
mysql_set_charset('utf8', $link);

在数据库连接的代码中添加以上两行。

3. 如果以上方法无效,可以尝试在数据库连接中设置字符集:

$link = mysqli_connect('localhost', 'user', 'password', 'database');
mysqli_set_charset($link, 'utf8');

在数据库连接的代码中添加以上一行。

以上是问题出现的原因以及解决方法,希望对您有帮助。

0