我再次遇到将特殊字符保存到数据库中的问题。经过大量的搜索,我仍然无法找到解决方案,所以我开始了一个新的线程。
我使用UTF-8字符集和PHP应用程序将MySQL数据从XML文件读入数据库。早些时候我遇到了爱沙尼亚人的问题,我设法解决了这个问题。例如& scaron; (š)是XML格式的html实体& ETH;它用PHP转换为& #353 ;.在早期的PHP脚本中我运行mysql查询“SET NAMES utf8”。 š正确保存到DB中。
现在我正在与立陶宛字符作斗争,例如ų(&#371),这是一个数字实体,& #371;,在XML文件中。我没有在PHP中进行任何转换,因为我假设当& ETH;转换为& #353;与scaron合作,不应该& #371;保存到数据库为ų没有PHP转换?保存后出现在DB中作为问号,如果我尝试使用mb_convert_encoding()或html_entity_decode(),结果是ų。
有什么建议吗?
答案 0 :(得分:1)
你应该确保你的表具有正确的编码并在连接后运行SET名称。
我准备了简单的测试。尝试运行它以确保一切正常。
1)创建数据库testencoding并将以下代码导入
CREATE TABLE IF NOT EXISTS `sample` (
`id` int(11) NOT NULL,
`value` varchar(255) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
--
ALTER TABLE `sample`
ADD PRIMARY KEY (`id`);
2)创建包含以下内容的简单PHP脚本并运行它:
<?php
header('Content-Type: text/html; charset=utf-8');
mb_internal_encoding('utf-8');
$subjectvalue='ų ų';
$link = mysqli_connect("localhost","root","","testencoding");
mysqli_query($link,"SET NAMES 'utf8'");
mysqli_query($link,"INSERT INTO sample(`value`) VALUES('".mysqli_real_escape_string($link,$subjectvalue)."')");
$result = mysqli_query($link, "SELECT * FROM sample");
echo "<br /><br />Data from database<br /><br />";
while ($data = mysqli_fetch_assoc($result)) {
echo $data['id'].' '.$data['value']."<br />";
}
3)在我的电脑上,所有结果都符合预期:
作为PHP文件的输出,我有:
Data from database
1 ų ų
在phpMyadmin中我有:
ų ų
所以一切正常。试一试并与我的结果进行比较