0

我最近遇到了一个奇怪的字符串问题:

我有 2 张桌子:

| AgentCodes | CREATE TABLE `AgentCodes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `AgentName` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `AgentName` (`AgentName`),
) ENGINE=ndbcluster AUTO_INCREMENT=319 DEFAULT CHARSET=latin1 |

| AgentNumbers | CREATE TABLE `AgentNumbers` (
  `AgentName` varchar(32) NOT NULL,
  `TelephoneNumber` varchar(64) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `AgentName` (`AgentName`),
  KEY `TelephoneNumber` (`TelephoneNumber`),
) ENGINE=ndbcluster AUTO_INCREMENT=62 DEFAULT CHARSET=latin1 |

LIKE对 AgentCodes.AgentName 表不起作用,我猜是因为 AgentName 有unicode字符集,所以我将该字段上的字符集更改为Latin1.

现在的问题是 AgentNumbers 表被用作 AsteriskPBX 队列的实时表 基本上,我得到了代理的名称并将呼叫者放入该队列。

例如,我得到了 JohnDoe 这个名字,conf 文件如下所示:

[JohnDoe]
musicclass = temp
timeout = 35
member => SIP/...

我得到一个错误,说没有这样的队列。我知道问题出在哪里,所以我将数据库中的名称复制到该 conf 文件中,并且它起作用了。

我的问题是什么可能导致该问题,在文件中看到 2 个字符串,另一个在数据库中,将它们复制/粘贴到第三个文件中(它们看起来仍然相同)并且它们不被识别为相同?

我想这与编码/字符集有关,但我想听听为什么:)

4

1 回答 1

2

不要忘记 MySQL LIKE 进行字符比较,而不是字符串比较。所以像尾随空格这样的事情很重要。而且我们没有实际的 SQL,例如,它是您要比较的文字还是变量。

另外,为什么在 2 个不同的表中有 AgentName?这看起来并没有标准化,当然您现在正在了解为什么标准化很重要。

于 2013-06-10T06:46:29.660 回答