2014-10-10 72 views
0

我有一个MySQL表,我设置为使用的编码utf8_swedish_ci。两个示例值是2 Kung1 Krön - 注意瑞典字符。我需要从PHP脚本中搜索这些国际化的字符串。我的PHP文件编码在UTF-8。我的代码,错误处理剥离的清晰,看起来是这样的:编码问题与库MySQLi

$db = new mysqli($host, $user, $password, $user); 
$db->set_charset('UTF-8'); 
$stm = $db->prepare('SELECT `id` FROM `myTable` WHERE `bok` LIKE ?'); 
echo "Searching on $value'..."; 
$stm->bind_param('s', $value); 
$stm->execute(); 
$stm->bind_result($result); 
$stm->close(); 
echo "Fetched '$result'."; 

现在,如果我$值设置为第一个例子中的值,我得到了一个匹配的行。使用另一个示例值,我不会获得行。我已经测试了查询在PHPMyAdmin中的工作。我认为错误在于国际角色,因此我在某个地方搞乱了编码。那么我做错了什么,我该如何解决这个问题?

编辑:行$db->set_charset('UTF-8');失败,因为我使用了不正确的字符集。它应该是utf8。原来我的错误处理太少了,我应该在set_charset之后检查$db->error

+0

你在哪里错了:在创建表的时候没有指定编码,因此它使用的默认。如何解决它:[将编码更改为一致。](http://stackoverflow.com/questions/6115612/how-to-convert-an-entire-mysql-database-characterset-and-collat​​ion-to-utf -8) – Sammitch 2014-10-10 19:25:53

+0

@Sammitch你为什么认为他没有指定编码? @David尝试设置名称并在列名和表名中使用反引号,因为如果您在某些情况下不会导致问题。你还检查'$价值'是否正确? – 2014-10-10 19:32:23

+0

@Sammitch我确实指定了表格的编码。 @LaciK我实际上使用反引号,当我将这个示例拉到一起时,将它们移除。我使用了'echo $ value',所以我相信它具有正确的价值。 – David 2014-10-10 20:03:18

回答

1
$db->set_charset('UTF-8'); 

注意,MySQL是特别的名字,它使用内部的UTF-8字符集是utf8(不含破折号),而不是常规的UTF-8

如有疑问,请参阅SHOW CHARACTER SET;

-1

试试这个,它可能会有所帮助。

$db = new mysqli($host, $user, $password, $user); 
$db->set_charset('UTF-8'); 
$stm = $db->prepare('SELECT `id` FROM `myTable` WHERE `bok` LIKE ?'); 
$value = '%'.$value.'%'; //added this line 
$stm->bind_param('s', $value); 
$stm->execute(); 
$stm->bind_result($result); 
$stm->close(); 
echo "Fetched '$result'."; 

我试图LIKE '' 用UTF-8字符的一个字符(180)柱,用utf8_general_ci编码,所以我与LIKE%尝试过它返回0行 '' %,而工作

+0

但我没有使用utf8_general_ci,我正在使用utf8_swedish_ci。我尝试了你的建议,但没有任何区别。 – David 2014-10-11 11:33:45