我有一个用于插入的巨大插入 sql 脚本,并且这个插入在 MySQL 5.5 版本中是可能的,但在 Mysql 8 中不是:
CREATE TABLE IF NOT EXISTS `accounts` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`NickName` varchar(24) CHARACTER SET cp1251 COLLATE cp1251_general_cs NOT NULL,
`Password` varchar(64) NOT NULL DEFAULT 'NULL',
`RegIP` varchar(16) NOT NULL DEFAULT 'No IP Adress',
`OldIP` varchar(16) NOT NULL DEFAULT 'No IP Adress',
`CheckIP1` varchar(16) NOT NULL DEFAULT 'No IP Adress',
`RegData` varchar(16) NOT NULL DEFAULT 'No IP Adress',
`Referal` varchar(24) NOT NULL DEFAULT 'No Referal',
`Mail` varchar(50) NOT NULL DEFAULT 'No Mail Adress',
`Telephone` varchar(20) NOT NULL DEFAULT 'No Telephone',
`ForumName` varchar(30) NOT NULL DEFAULT 'No Forum Name',
`Level` int(11) NULL,
`Exp` int(11) NULL,
... more than 150 columns
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=8 ;
我试图通过将其设置为来禁用所有 sql 模式:--sql-mode="NO_ENGINE_SUBSTITUTION"
。然后我在数据库中检查并设置了它,即使在此之后它也不起作用。之前有太多的模式,比如strict_trans_tables
等等。
然后游戏在日志中返回:
[错误] CMySQLQuery::Execute[OnPlayerRegisterMysql] -(错误 #1364)字段“Exp”没有默认值:
(Query: "INSERT INTO `accounts` (`ID`,`NickName`,`Password`,`RegIP`,`CheckIP1`,`RegData`,`Level`,`Sex`,`Age`,`Race`,`Referal`,`Mail`,`Telephone`,`Money`,`Bank`,`HouseKey`,`BizKey`,`From
`,`OOC`,`Snow`, `VirMoney`, `Online_status`,`Online`) VALUE (NULL,'Jonny_Sky', 'password', '0.0.0.0', 'No IP Adress', '2021-7-23', '1', '1', '0', '0'
, 'No Referal', 'No Mail Adress', 'No Telephone', '10000000', '0', '-1', '-1', '-1', '0', '1', '10000', '1001', '3')")
MySQL 8 中是否有任何设置允许此类插入?正如我提到的,一切都在 MySQL 5.5 中运行。
更新:
我不明白 MySQL 5.5,6 到 8 的版本有什么区别。工作游戏脚本在迁移到 8 后停止工作。即使我进行了另一个工作转储(相信如果我错了),那么同样 - Mysql 8 抱怨插入如所示。此外,我什至将所有NOT NULL
没有默认值的字段更改为NULL
. 即使在那里,也没有运气。
致nbk:谢谢,看来我可能错过了那一步,我不知道。我必须了解升级过程。然后我会回来报告。换句话说,我知道必须对某些类型的数据库(Sybase)进行升级,但很困惑,相信不是 MySql 8。所有其他转储(cms,网站)在 MySQL 8 上无需升级即可工作。
提出了改变问题生活的新问题:我一直习惯于使用命令启动 MySql 8 的第二个实例:
在 Debian 命令行中我可以连接到这个数据库的问题是:
mysql --socket=/var/run/mysqld/second_server.sock -u root -p
当我从 php Adminer 连接(使用 localhost:3307)时 - 我连接到 localhost:3307,但数据库来自 3306,来自第一个实例!在第一个实例中还提供游戏数据库,一个旧数据库。所以一直以来,游戏都是首先与错误的旧数据库进行通信!即使在游戏脚本中也设置了端口 3307。所以Mysql 8通过某种方式将3306实例重定向到3307。从命令行我可以连接到所需的数据库。
tcp6 0 0 :::3306 :::* LISTEN 6149/mysqld
tcp6 0 0 :::3307 :::* LISTEN 7162/mysqld
如您所见,第二个实例已启动,但为什么Mysql将3306数据库克隆到3307?我将不胜感激任何帮助。我现在正在尝试使用 mysqld_multi,但是这个工具不会启动,说 - 在 /usr/bin/mysqld_multi 第 684 行打印宽字符。
我需要第二个实例才能设置不同的配置。
更新: 看起来我可能找到了答案。
这是因为如果您指定“-h localhost” - 它会将您连接到 MySQL 套接字,并且 --port 将被忽略(不使用 TCP/IP,因此 --port 选项没有意义)。
要连接到不同的端口,只需使用不是“localhost”而是 127.0.0.1 的地址:
归功于:https ://lxadm.com/MySQL:_connecting_to_different_ports_on_localhost
所以,我必须照顾 127.0.0.1:my 端口。可能需要绑定等。
所以,终于它现在开始工作了,我学到的教训是 localhost 与 127.0.0.1 不同。我刚刚对 *.cnf 进行了编辑: