假设我们有大约1000行必须在MySQL数据库中音译。下面的PHP音译函数效果很好
public static function tlit($str)
{
$orig = array("ə", "ü", "i", "ö", "ı", "ç", 'ş', "ğ", "Ə", "Ü", "İ", "Ö", "I", "Ç", 'Ş', "Ğ");
$tlit = array("e", "u", "i", "o", "i", "c", 's', "g", "E", "U", "I", "O", "I", "C", 'S', "G");
return $textcyr = str_replace($orig, $tlit, $str);
}
对于字母ə
,我们有2个替代字母:a
和e
。例如,如果单词是Əli
,我想在结果中得到Eli
和Ali
。
对于字母ş
,我们有两个替代字母:sh
和s
。例如,如果word是Şəhər
,结果将像:
- 医师
- Sheher
- 萨哈尔
- 日常用品的
对于字母ç
,我们有两个替代字母:ch
和c
。
我不知道如何创建MySQL函数替代,它将像这样音译。有解决方案吗?
好吧,我不是专家,但作为一个说西班牙语的人,我过去遇到过类似的问题。
你认为你可以处理MySQL排序问题吗?也许你可以从这里选择一个排序http://dev.mysql.com/doc/refman/5.5/en/charset-charsets.html,然后MySQL会为你做翻译。
也许这不是解决方案,但它可以为你如何寻找你的目标提供一些思路。
正确的方法是-使用应用程序,因为MySQL存储的代码在这种情况下非常有限。首先,MySQL没有任何(合理的)数组替代品。因此,你不能指定像"符号列表"这样的东西。其次,DBMS中的替换可能会导致许多与排序相关的不同问题。这可能真的很痛苦——找出在这种情况下出了什么问题。
然而,如果你的符号列表总是投影1:1(因此,单个符号将总是被单个符号替换),那么你可以用纯字符串"模拟"数组。也就是说-通过字符串索引(即偏移量)维护替换之间的关系。使用这个原则,你可以这样写:
DELIMITER //
CREATE FUNCTION TRANSLIT_SYMBOLS(str VARCHAR(255), c_in VARCHAR(255), c_out VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE pos INT DEFAULT 1;
DECLARE sym INT DEFAULT 0;
DECLARE final VARCHAR(255) DEFAULT '';
DECLARE till INT DEFAULT 0;
IF CHAR_LENGTH(c_in)!=CHAR_LENGTH(c_out) || !CHAR_LENGTH(c_in) THEN
SIGNAL SQLSTATE '80800' SET MESSAGE_TEXT = 'Incompatible or empty transliteration lists';
END IF;
SET till = CHAR_LENGTH(str);
WHILE pos<=till DO
SET sym = LOCATE(SUBSTR(str, pos, 1), c_in);
IF sym THEN
SET final = CONCAT(final, SUBSTR(c_out, sym, 1));
ELSE
SET final = CONCAT(final, SUBSTR(str, pos, 1));
END IF;
SET pos = pos+1;
END WHILE;
RETURN final;
END//
DELIMITER ;
:
-
str
是输入字符串-因此在它内部将进行替换 -
c_in
是字符串,其中的字符将被视为符号来替换 -
c_out
是字符串,其字符将被视为替换符号。
用法是
mysql> select translit_symbols('foo', 'of', 'ab');
+-------------------------------------+
| translit_symbols('foo', 'of', 'ab') |
+-------------------------------------+
| baa |
+-------------------------------------+
1 row in set (0.00 sec)
关于排序-由于此函数使用直接字符串偏移量,它应该可以正确地使用多字节符号,但只有在相应的连接&数据整理匹配。我还没有在其他情况下测试过它,所以如果排序不同,可能会导致意想不到的结果——但这也是因为MySQL存储函数对于这种情况是一个糟糕的选择。