Php 使用非英语字符更新MySQL表无效,排序规则和字符集都设置为utf8或utf8mb4
我在尝试更新数据库时遇到问题,我认为与字符集/排序问题有关。我搜索了所有其他相关问题,更新了排序规则和字符集,尝试了所有方法,但似乎没有任何效果 我正在做的是从抓取一些HTML(获得网站所有者的许可)中获取数据,对其进行一点操作,然后执行Php 使用非英语字符更新MySQL表无效,排序规则和字符集都设置为utf8或utf8mb4,php,mysql,encoding,utf-8,Php,Mysql,Encoding,Utf 8,我在尝试更新数据库时遇到问题,我认为与字符集/排序问题有关。我搜索了所有其他相关问题,更新了排序规则和字符集,尝试了所有方法,但似乎没有任何效果 我正在做的是从抓取一些HTML(获得网站所有者的许可)中获取数据,对其进行一点操作,然后执行更新将操作后的数据保存在我的表中 我有一个字段,reference,它取自HTML,更新会查找该字段,如果该字段匹配,就会更新我的表。如果没有特殊(非英语)字符,它可以正常工作: UPDATE database.table SET points=100,其中re
更新将操作后的数据保存在我的表中
我有一个字段,reference
,它取自HTML,更新会查找该字段,如果该字段匹配,就会更新我的表。如果没有特殊(非英语)字符,它可以正常工作:
UPDATE database.table SET points=100,其中reference='Real Madrid'
如果参考中有任何非英语字符
,那么如果我从我的PHP/HTML站点进行更新,则更新不起作用-如果我将下面的查询直接放入phpmyadmin
,则可以正常工作:
UPDATE database.table SET points=100,其中reference='Atlético Madrid'
这发生在我尝试过的每一个非英语字符上,而不仅仅是é
,所以这似乎是根本问题
我摄取的HTML最初是UTF-8
,但在某些时候,我的文本编码似乎正在从直接UTF-8
更改为ASCII
。ASCII
不是UTF-8
的子集吗?不完全确定这是否是问题所在,但编码不同,这很奇怪
下面是我的代码,在不同的时间指出了编码:
$html = file_get_html('http://url.to.scrape');
// At this point, `mb_detect_encoding($html)` is UTF-8.
$i = 1;
while($i <= 20){
foreach($html->find('tr') as $tableRow) {
// At this point, `mb_detect_encoding($tableRow) is `ASCII`
$rowData['team'] = $tableRow->find('td', 0)->plaintext;
// At this point, `mb_detect_encoding($rowData['team']) is `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);
}
}
$html=file\u get\u html('http://url.to.scrape');
//此时,`mb_detect_encoding($html)`是UTF-8。
$i=1;
而($i find('tr')为$tableRow){
//此时,`mb_detect_encoding($tableRow)是`ASCII`
$rowData['team']=$tableRow->find('td',0)->明文;
//此时,`mb_detect_encoding($rowData['team'])是`ASCII`
$rowData['points']=$tableRow->find('td',1)->纯文本;
$points=$rowData['points']*dosomeoperationhere();
$update_query=“update database.table SET points=$points WHERE reference='””$rowData['team']。“”;
打印(更新查询);
}
}
如前所述,如果$rowData['team']
不包含非英语字符,则它可以工作。如果它确实包含任何内容,则不包含任何内容
同样,如前所述,如果我print\r($update\u query)
,并将输出直接复制/粘贴到SQL
选项卡中的phpmyadmin
,它会按预期工作,即使带有字符,因此我相信MySQL字符集/排序规则设置正确,这是PHP/HTML/MySQL连接中的某个地方导致的问题
我想我需要弄清楚为什么我的数据在开始时是UTF-8
的时候突然变成了ASCII
我的设置:
MySQL服务器连接排序规则:utf8mb4\u unicode\u ci
MySQL表排序规则:utf8mb4\u unicode\u ci
MySQL字段排序规则:utf8mb4\u unicode\u ci
PHP默认字符集:UTF-8
HTML:
.htaccess
/charset.conf
:AddDefaultCharset UTF-8
(编辑:在最初发布后添加,感谢@asiri的建议)
我尝试发送标题('Content-Type:text/html;charset=utf-8')代码>,这没有帮助
我还看到了可怕的黑色问号�
当我在网站上查看这些字符时,一定是某个地方的编码,我只是不知道在哪里。您可以尝试在.htaccess文件中设置编码
AddDefaultCharset utf-8
将此行添加到放置代码的根目录中的.htaccess文件中
或
试试这个。下面的代码将在数据库连接中设置编码
$link = mysqli_connect('localhost', 'user', 'password', 'database');
mysql_set_charset('utf8',$link);
我在最初的帖子中没有提到这一点,但我已经在.htaccess
中提到了,而不是在我的apache2/conf enabled/charset.conf
config中。我在个人.htaccess
中也尝试过它,但没有成功,我想我应该把它放在服务器上看看是否有效。我的下一个建议是在数据库连接中设置字符集。我将相应地编辑答案。谢谢Asiri,不幸的是这也不起作用。我觉得我已经在UTF-8
问题线程中尝试了每一个建议,但似乎没有任何效果。看起来一切都是UTF-8,除了在PHP代码中执行实际查询的时间。