Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
在原则中配置索引文本长度MySQL_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

在原则中配置索引文本长度MySQL

在原则中配置索引文本长度MySQL,mysql,symfony,doctrine-orm,Mysql,Symfony,Doctrine Orm,我的数据库中有一个文本字段,上面有前10个字符的索引。我如何在我的条令实体中指定 我在任何地方都找不到有关特定于数据库的索引选项的任何信息:/ 这是我的“部分”MySQL create语句: KEY `sourceaddr_index` (`sourceaddr`(10)), 这是我在教义中的@索引: @ORM\Index(name="sourceaddr_index", columns={"sourceaddr"}, options={}), 这不会影响正常使用,但我在将开发部署到新

我的数据库中有一个文本字段,上面有前10个字符的索引。我如何在我的条令实体中指定

我在任何地方都找不到有关特定于数据库的索引选项的任何信息:/

这是我的“部分”MySQL create语句:

 KEY `sourceaddr_index` (`sourceaddr`(10)),
这是我在教义中的@索引:

 @ORM\Index(name="sourceaddr_index", columns={"sourceaddr"}, options={}), 
这不会影响正常使用,但我在将开发部署到新笔记本电脑时,以及在基于我的实体创建数据库时,注意到了问题


任何帮助都将不胜感激:)

简而言之:您不能在原则中设置此项。Doctrine的ORM特别关注跨供应商兼容性,您所描述的索引类型虽然在许多现代RDBMS中得到支持,但在一定程度上超出了Doctrine的处理范围

不幸的是,如果您使用Doctrine的模式更新程序(在Symfony中是
php应用程序/控制台Doctrine:schema:update--force
),如果您手动更新数据库,则Doctrine有时会回归更改以保持同步

在我需要这样的东西的情况下,我只是设置了一个函数,通过SQL发送相关的
altertable
语句。如果要分发代码(即,它可能在其他/旧的数据库上运行),则可以使用包装语句来确保


这并不理想,但一旦你的应用程序/软件稳定下来,这样的问题就不会经常发生。

在MySQL中手动创建索引后,我很幸运地在Doctrine中命名了索引。它既不美观也不优雅,如果您忘记重新创建索引,则很容易在从开发到生产的过程中出错。但是,教义似乎理解它,尊重它

在我的实体中,我有以下定义。教义忽略了长度选项——这是我一厢情愿的想法

/**
  * Field
  *
  * @ORM\Table(name="field", indexes={
  *     @ORM\Index(name="field_value_bt", columns={"value"}, options={"length": 100})
  * })
在MySQL中,我执行

CREATE INDEX field_value_bt  ON field (value(100))

就我所见,条令只保留索引,只要它的名称相同。

从条令2.9开始,可能的话,请参见:

不幸的是,原则似乎对空白位置非常挑剔,因此,例如,
update--dump-sql
产生:

 DROP INDEX slug ON wp_terms;
 CREATE INDEX slug ON wp_terms (slug(191));

即使你执行了这些操作,它们的消息也会保留在那里(用MariaDB 10.3.14测试)。

MySQL默认索引将超过10个字符。你真的需要将其限制为10个字符吗?谢谢,这很有帮助。。。知道平台特定选项的意义吗?当您开发DQL扩展之类的东西时,条令使用的平台抽象非常有用。例如,在MySQL中,您可以在某个日期前后调用
MONTH()
,以获取月份部分,而在PGSQL中,您可以
EXTRACT(x FROM y)
,通过平台检查,您可以为两个供应商执行一个扩展。简而言之:如果你正在做很多特定于平台的事情,也许使用通用ORM不是最好的选择。此外,如果你想将它添加到复合索引中,它也可以工作
options={“length”:{191,191}
options={“length”:{null,191}
 DROP INDEX slug ON wp_terms;
 CREATE INDEX slug ON wp_terms (slug(191));