字符串比较在数据库,文件中不起作用......字符集可能是个问题吗?

时间:2013-06-10 06:33:42

标签: mysql character-encoding string

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

我有两张桌子:

| 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/...

我收到错误消息 no such queue 。我知道问题是什么,所以我将名称从数据库复制到该conf文件,并且它有效。

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

我想这与Encoding / Charset有关,但我想知道为什么:)

1 个答案:

答案 0 :(得分:2)

不要忘记MySQL LIKE进行字符明智的比较,而不是字符串比较。所以尾随空间之类的东西很重要。而且我们没有实际的SQL,例如它是你要比较的文字或变量。

另外,为什么AgentName在2个不同的表中呢?这看起来并不规范,当然你现在发现为什么规范化很重要。