Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 具有utf8列名的条令查询_Symfony_Doctrine Orm - Fatal编程技术网

Symfony 具有utf8列名的条令查询

Symfony 具有utf8列名的条令查询,symfony,doctrine-orm,Symfony,Doctrine Orm,我将Symfony 2.7与条令一起使用,并且我正在尝试使用一个现有的数据库,其中我的列名使用非ascii字符,例如libellé(法语) 除了尝试显式使用该名称构建DQL查询外,一切都进行得很顺利。然后我得到一个错误: [语法错误]第0行第15列:错误:应为 条令\ORM\Query\Lexer::T_FROM,got'�' 对于查询: SELECT R.libellé, V.libellé FROM IutFranceBundle:Regions R INNER JOIN R.chefl

我将Symfony 2.7与条令一起使用,并且我正在尝试使用一个现有的数据库,其中我的列名使用非ascii字符,例如libellé(法语)

除了尝试显式使用该名称构建DQL查询外,一切都进行得很顺利。然后我得到一个错误:

[语法错误]第0行第15列:错误:应为 条令\ORM\Query\Lexer::T_FROM,got'�'

对于查询:

SELECT R.libellé, V.libellé 
FROM IutFranceBundle:Regions R 
INNER JOIN R.cheflieu V 
ORDER BY R.libellé ASC
我发现这个问题的唯一答案是避免在列名中使用非ascii字符。。。 我在PDO/MySQL查询中使用相同的数据库,使用非ascii字符,没有任何问题

我在条令代码中翻了一下,发现问题似乎出在Lexer.php类中,它使用了不合适的正则表达式


如果您可以共享解决方案,请提前感谢。

尝试将
utf8
添加到您的条令配置数据库参数中:

'params' => array(
    'host'     => 'localhost',
    'port'     => 'yourport',
    'user'     => 'username',
    'password' => 'password',
    'dbname'   => 'yourdatabase',
    'charset'  => 'utf8',
)

查看更多详细信息。

谢谢您的回答。重点不在Doctrine和MySQL之间,我将Symfony配置为使用UTF-8,它可以正常工作

在解析DQL查询时,问题涉及到条令本身。我找到了一个需要修补2个条令文件的解决方案:

vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php
vendor/doctrine/orm/lib/Doctrine/ORM/Query/Lexer.php
在第一个示例中,我只需在方法
getModifiers
中添加'u'修饰符,然后在最后一个示例中,我更改方法
getCatchablePatterns
,将
a-z
替换为
\w
(它代表任何字母或)

现在很好用。我认为最后一个补丁也可以安全地应用于方法
getCatchablePatterns

vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php

再次感谢。

在编程时永远不要使用非ASCII字符。。。它们只允许出现在用户内容中,而不允许出现在代码或DB列名中。使用它们只会导致您面临当前所面临的问题。