Php ZendFramework在插入mysql时从第一个非a-z字符中剪切字符串

Php ZendFramework在插入mysql时从第一个非a-z字符中剪切字符串,php,mysql,zend-framework,utf-8,character-encoding,Php,Mysql,Zend Framework,Utf 8,Character Encoding,当我用Zend_Form将一些数据插入带有非a-z字符(如chrząszcz)的数据库时,它会剪切我的字符串,并且在数据库中我只保存了chrz 在MySql中的每一次都设置为utf8\u general\u ci,当连接MySql时,我调用set CHARACTER set'utf8',文件也是UTF-8 我不知道该怎么办 我还编写了独立脚本,它插入并读取正确的字符串ZendFramework读取的结果也正确。问题只在于插入 有人知道怎么修吗 更新: 如果我插入带有以下内容的数据: $db-&g

当我用
Zend_Form
将一些数据插入带有非
a-z
字符(如
chrząszcz
)的数据库时,它会剪切我的字符串,并且在数据库中我只保存了
chrz

MySql
中的每一次都设置为
utf8\u general\u ci
,当连接
MySql
时,我调用
set CHARACTER set'utf8'
,文件也是
UTF-8

我不知道该怎么办

我还编写了独立脚本,它插入并读取正确的字符串
ZendFramework
读取的结果也正确。问题只在于插入

有人知道怎么修吗

更新:

如果我插入带有以下内容的数据:

$db->query("INSERT INTO unit SET name = 'chrząszcz'");
ZendFramework
中,它可以工作。问题在于以这种方式插入:

$unitTable = new Model_Unit_Table();
$unit = $unitTable->createRow();
$unit->setFromArray($form->getValues());
$unit->save();
更新2:

问题在于使用
Zend_Filter_StringToLower
——它将字符串
chrząszcz
修改为
chrz�szcz


如何使此过滤器正常工作?

我很确定这是一个编码问题。第一个非标准字符(即ASCII字符集上方)处的字符串脱落通常是由于在非UTF8上下文中插入UTF-8数据造成的,因此我的第一个怀疑是数据库连接的编码设置不正确

  • 你能试试
    $db->query(“SET NAMES utf8”)在调用插入命令之前
  • Zend_表单使用的连接是否明确
    $db
  • 您是否100%确定表单所在的页面是UTF-8编码的

    • 回应您的评论:

      否$form->getValue()的var_转储 给chrz�szcz。当var_转储一个 $\u POST superglobal it提供了正确的 克尔兹兹茨

      这行吗

      $testArray = array('name' => 'chrząszcz');
      
      $unitTable = new Model_Unit_Table();
      $unit = $unitTable->createRow();
      $unit->setFromArray($testArray);
      $unit->save();
      
      如果是,您的问题可能与Zend_Form更相关

      编辑:

      您的筛选器需要使用而不是

      Edit2:

      试试这个:

      $filter = new Zend_Filter_StringToLower();
      $filter->setEncoding('UTF-8');
      

      1. <代码>设置名称utf8
      未更改任何内容。2.如何检查/执行?3.是的,我百分之百肯定。我不是Zend人,所以我不知道,抱歉。但是我想象这些类有一个
      $db
      对象你能发布一个这样的实例吗?$form->getValues()返回正确的字符串吗?
      $form->getValues()
      var\u dump
      给出了
      chrz�szcz
      。当
      var_dump
      a
      $\u POST
      superglobal时,它会给出正确的
      chrząszcz
      。是。我发现了问题-请查看
      更新2
      。是否可以为所有形式的所有过滤器永久设置编码为
      UTF-8
      ?很抱歉,我不知道任何内置方法可以做到这一点。但是您可以使用自己的过滤器扩展
      Zend\u Filter\u StringToLower
      ,该过滤器使用UTF-8作为默认编码。