直到今天我才意识到我在PHP脚本中遗漏了这个:
mysql_set_charset('utf8');
Run Code Online (Sandbox Code Playgroud)
我的所有表都是InnoDB,排序规则"utf8_unicode_ci",我所有的VARCHAR列都是"utf8_unicode_ci".我有mb_internal_encoding('UTF-8');我的PHP脚本,我的所有PHP文件都编码为UTF-8.
所以,直到现在,每次我用变音符号"插入"某些东西,例如:
mysql_query('INSERT INTO `table` SET `name`="Jáuò Iñe"');
Run Code Online (Sandbox Code Playgroud)
在这种情况下,'name'内容将是:Jáuò Iñe.
由于我在PHP和MySQL之间修复了字符集,因此新的INSERT现在可以正确存储.但是,我想修复目前"混乱"的所有旧行.我已经尝试了很多东西,但它总是打破第一个"非法"角色的字符串.这是我目前的代码:
$m = mysql_real_escape_string('¿<?php echo "¬<b>\'PHP á (á)??riî? </b>"; ?> ?-?i abcdd;//;ñç´????????ç?â????????????ñ ;');
mysql_set_charset('utf8');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('latin1');
mysql_query('INSERT INTO `table` SET `name`="'.$m.'"');
mysql_set_charset('utf8');
$result = mysql_iquery('SELECT * FROM `table`');
while ($row = mysql_fetch_assoc($result)) {
$message = $row['name'];
$message = mb_convert_encoding($message, 'ISO-8859-15', 'UTF-8');
//$message = iconv("UTF-8", "ISO-8859-1//IGNORE", $message);
mysql_iquery('UPDATE `table` SET `name`="'.mysql_real_escape_string($message).'" WHERE `a1`="'.$row['a1'].'"');
}
Run Code Online (Sandbox Code Playgroud)
除了在字符"ă"之后字符串被截断之外,它还使用期望的字符"UPDATE".我的意思是,字符串中不包含该字符和后续字符.
此外,使用"iconv()"(在代码上注释)进行测试也是如此,即使使用// IGNORE和// TRANSLIT也是如此
我还测试了ISO-8859-1和ISO-8859-15之间的几个字符集.
我真的需要帮助!谢谢.
有关最新信息和当前状态,请参阅此帖子的底部
按照这样的帖子提供建议: 在准备好的声明中使用通配符 - MySQLi
我已经设置了我的语句,它没有错误.但它没有返回正确的数据.
我的select语句对WHERE有这个:
WHERE `Name` LIKE ? order by `Name`
Run Code Online (Sandbox Code Playgroud)
我的字符串设置绑定,然后是实际绑定.
$whatToBind = '%'. $whatName .'%';
$stmt = $mysqli->prepare($selectStr);
$stmt->bind_param('s', $whatToBind);
$stmt->execute();
Run Code Online (Sandbox Code Playgroud)
当我得到回报时,它将完全错过它应该匹配的记录.就像,如果我发送"Ken L",我会收回"Ken Linton"的记录,而不是"Ken Lawton".如果我投入"劳顿",我根本得不到任何回报.
这是全面的典型行为.如果我搜索电话号码字段,则返回"658",但"609-658"不返回.
如果有人能够让我了解我所缺少的东西,那就太好了.
返回的示例显示了我所指的确切示例:
要回答的问题: 还有一些要检查的事项:
检查MySQL/PHP交互字符集是否设置正确,通常使用:$ mysqli-> set_charset("utf8mb4"); 在建立数据库连接之后.
它被设置为utf8.虽然在设置之前它的行为相同.
你能显示$ mysqli-> error的任何输出吗?
没有错误.只是不完整的回报
你能告诉我们你的整个SQL查询吗?
它包含在屏幕抓取中.虽然,这只是一个简单的字符串.并且它没有考虑准备好的声明的样子.
你能展示Names专栏的Collation/MySQL结构吗?
根据GoDaddy的phpMyAdmin,它都是utf8
你能在绑定之前展示$ whatName的价值吗?
它位于屏幕抓取的顶部.在其他任何事情发生之前,它回应显示它.
在这一点上,我认为问题在于当我搜索的字段有空格或其他不是字母的字符时会发生什么.不是我准确传递的东西.但更像是,一旦准备好陈述,准备的东西就不匹配它所搜索的领域.当您在空间存在之前搜索字段时,不会发生这种情况.这就是为什么"肯"在100%的时间里工作,但"劳顿"完全失败.它是在空间之后.
我尝试了各种方式转换编码类型.我已经尝试了连接字符串的各种方法.我得到的结果要么不是更好,要么彻底打破它.
如果有人有更多的想法,还有21个小时的奖励.在这一点上,我会更乐意为每个提供最佳信息的两个人提供25个奖励.奖励一个而不是另一个似乎是不公平的.