我需要在PHP中复制MySQL utf8_general_ci
排序规则的行为。严格来说,我需要发现什么被认为是不同的,什么被认为是相同的。案例独立部分很容易。问题是utf_general_ci
认为带有变音符号的字符和没有变音符号的字符是相等的:e =è=état。要复制这种比较,我需要有一种方法来替换è - > e,é - >即
我想到的方法是:
echo iconv("utf-8", "ascii//TRANSLIT", "é");
一个问题是iconv
的行为有所不同,具体取决于当前的语言环境,而且这是一个问题。
另一个问题是输入也可能包含Cirillic字母,不应该被删除或导致PHP通知。
echo iconv("utf-8", "ascii//TRANSLIT", "дом");
是否有解决方案或者我是否必须手动将具有变音符号的每个字符映射到没有变音符号的字符?
答案 0 :(得分:4)
intl' Transliterator将让您定义更深入的音译规则。有关音译规则的完整文档可以在icu-project.org上找到。
{
"technical": {
"topic": "my topic",
"nature": "my nature",
"event_id": "1010101"
},
"payload": {
"__type": "AuthorizationRequest:#Question48583688"
}
}
输出:
$tests = [ "é", "дом" ];
$tl = Transliterator::create('Latin-ASCII;');
foreach($tests as $str) {
var_dump(
$tl->transliterate($str)
);
}
答案 1 :(得分:0)
目标是防止表格中已存在的碰撞价值&#39 ;?有重音字母应该允许与不同的口音和非口音共存?然后更改导致冲突的PRIMARY
(或UNIQUE
)键的排序规则。
任何..._bin
COLLATION
都允许e
和é
共存(在插入过程中不会发生碰撞),因为它会将它们视为不同。
出于其他原因,您是否需要...general_ci
?如果是,请说明原因。如果没有,请ALTER TABLE
更改COLLATION
。我认为不需要PHP代码。