更新MySQL表格时,使用非英语字符无法正常工作,排序规则和字符集都设置为utf8或utf8mb4。
更新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
变为ASCII
。 ASCII
不是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)
,并将输出的内容直接复制粘贴到phpmyadmin
的SQL
选项卡中,它可以按预期工作,即使包含é字符,这使我相信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.conf
: AddDefaultCharset UTF-8
(编辑:在最初发布后添加,感谢@asiri的建议)
我尝试了发送header('Content-Type: text/html; charset=utf-8');
,但没有帮助。
当我在网站上查看这些字符时,也看到了可怕的黑色问号�
,所以肯定是某处的编码问题,只是我不知道是在哪里。
问题出现的原因:
- 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');
在数据库连接的代码中添加以上一行。
以上是问题出现的原因以及解决方法,希望对您有帮助。