我最近遇到了一个奇怪的字符串问题:
我有两张桌子:
| 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有关,但我想知道为什么:)
答案 0 :(得分:2)
不要忘记MySQL LIKE进行字符明智的比较,而不是字符串比较。所以尾随空间之类的东西很重要。而且我们没有实际的SQL,例如它是你要比较的文字或变量。
另外,为什么AgentName在2个不同的表中呢?这看起来并不规范,当然你现在发现为什么规范化很重要。