我有一个存储在MySQL数据库中的the Geonames database的副本,以及一个PHP应用程序,它允许用户在数据库中搜索他们的城市。如果他们用英文输入城市名称,那么它可以正常工作,但我希望他们能够用母语进行搜索。使用非拉丁字符搜索Geoname数据库
例如,他们应该可以搜索東京
,而不是让日语人员搜索Tokyo
,而应该能够搜索東京
。
地名数据库包含alternatenames
柱, “alternatenames, comma separated, ascii names automatically transliterated, convenience attribute from alternatename table, varchar(10000)
。”
例如,Tokyo
行的alternatenames
值为Edo,TYO,Tochiu,Tocio,Tokija,Tokijas,Tokio,Tokió,Tokjo,Tokyo,Toquio,Toquio - dong jing,Toquio - æ±äº¬,Tòquio,Tókýó,Tóquio,TÅkyÅ,dokyo,dong jing,dong jing dou,tokeiyw,tokkiyo,tokyo,twkyw,twqyw,Τόκιο,Токио,Токё,Токіо,ÕÕ¸Õ¯Õ«Õ¸,טוקיו,توكيو,توکیو,طوكيو,ܛܘܟÜܘ,ܜܘܟÜܘ,टोकà¥à¤¯à¥‹,டோகà¯à®•à®¿à®¯à¯‹,โตเà¸à¸µà¸¢à¸§,ტáƒáƒ™áƒ˜áƒ,东京,æ±äº¬,æ±äº¬éƒ½,ë„ì¿„
。
这些值完全不包含東京
,但我猜测它们包含已经以某种方式编码或转换的形式。所以,我假设如果我对我的搜索字符串执行相同的编码/转换,那么我将能够匹配该行。例如:
mysql_query(sprintf("
SELECT * FROM geoname
WHERE
MATCH(name, asciiname, alternatenames)
AGAINST (%s)
LIMIT 1",
iconv('UTF-8', 'ASCII', '東京')
));
问题是我不知道该转换是什么。我尝试了很多iconv()
,mb_convert_string()
等组合,但没有运气。
MySQL表看起来是这样的:
CREATE TABLE `geoname` (
`geonameid` int(11) NOT NULL DEFAULT '0',
`name` varchar(200) DEFAULT NULL,
`asciiname` varchar(200) DEFAULT NULL,
`alternatenames` mediumtext,
`latitude` decimal(10,7) DEFAULT NULL,
`longitude` decimal(10,7) DEFAULT NULL,
`fclass` char(1) DEFAULT NULL,
`fcode` varchar(10) DEFAULT NULL,
`country` varchar(2) DEFAULT NULL,
`cc2` varchar(60) DEFAULT NULL,
`admin1` varchar(20) DEFAULT NULL,
`admin2` varchar(80) DEFAULT NULL,
`admin3` varchar(20) DEFAULT NULL,
`admin4` varchar(20) DEFAULT NULL,
`population` int(11) DEFAULT NULL,
`elevation` int(11) DEFAULT NULL,
`gtopo30` int(11) DEFAULT NULL,
`timezone` varchar(40) DEFAULT NULL,
`moddate` date DEFAULT NULL,
PRIMARY KEY (`geonameid`),
KEY `timezone` (`timezone`),
FULLTEXT KEY `namesearch` (`name`,`asciiname`,`alternatenames`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4
任何人都可以点我在正确的方向?
'SHOW CREATE TABLE geoname'告诉你什么? – miken32
并停止使用那些过时的,无保留的,不推荐使用的和不安全的[mysql_ *函数](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。 – miken32
@ miken32:我不是,它只是一个简化的最小化示例。 –