Symfony 具有utf8列名的条令查询
我将Symfony 2.7与条令一起使用,并且我正在尝试使用一个现有的数据库,其中我的列名使用非ascii字符,例如libellé(法语) 除了尝试显式使用该名称构建DQL查询外,一切都进行得很顺利。然后我得到一个错误: [语法错误]第0行第15列:错误:应为 条令\ORM\Query\Lexer::T_FROM,got'�' 对于查询: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
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列名中。使用它们只会导致您面临当前所面临的问题。