声明:
$scope.getPosts = function() {
PostsService.getPosts($scope.token).then(function(result) {
$scope.posts = result.data;
angular.forEach($scope.posts, function(value, key) {
var str = value.created_at;
value.data = str.slice(0, 10);
value.hour = str.slice(11, 25);
})
console.log($scope.posts);
})
}
ut8mb4_unicode_520_ci
如何正确查询包含dakuten或handakuten日文字符的表字段? Dakuten
目前,即使在为tenten版本运行查询时,似乎也会返回基本字符。
示例数据
给定ut8mb4_unicode_520_ci
和へ
。
还有一行ぺ
情景1
运行:
ID: 199, post_title: 'へ';
场景2
运行:
SELECT 'へ' = 'ぺ';
-- Returns 0. Correct
场景3
但是,出于某种原因,当我运行此查询时,它仍会返回记录199,注意到不同的标题值。
运行:
SELECT ID, post_title
FROM wp_posts
WHERE post_title = 'へ';
-- Returns row 199. Correct
示例图片
图像可以更好地解释(我只是使用union来更好地在一个屏幕截图中显示所有内容):
有没有一个可靠的方法来处理这些角色?所有其他日文字符似乎工作得很好,它只是dakuten版本被视为只在查询中的基础。
答案 0 :(得分:3)
这是因为您使用的排序规则(utf8mb4_unicode_ci,utf8mb4_unicode_520_ci和utf8mb4_0900_ai_ci)仅比较字符的基本字母。例如,'ぺ' ='へ' + U + 309A◌゚,'へ'是'ぺ'的基本字母。所以对于你的情况,所有3个字符'基本字母相同,'へ'。因此,这些归类返回' 1'
是正确的结果MySQL团队正在为utf8mb4字符集开发一个新的日语排序规则。它将这些dakuten字符与基本字符区分开来。它很快就会到来。
答案 1 :(得分:1)
SELECT 'へ' = 'ぺ' COLLATE utf8mb4_unicode_ci; --> 0 (ditto for general_ci)
SELECT 'へ' = 'ぺ' COLLATE utf8mb4_unicode_520_ci; --> 1
后者是较新的 Unicode标准,因此理论上它更为正确。
但你到底在做什么?可能比较一列与另一列?它们都是utf8mb4_unicode_520_ci
吗? (数据库和连接并不重要。)
或者=
列的一侧是另一侧,另一侧是文字吗?
连接时是否建立了整理?
<强>附加物强>
在8.0.0版中,所有这些都提供了1
:
utf8mb4_unicode_ci -- a change from 0 in 5.6.12, but 1 in 5.7.15?
utf8mb4_unicode_520_ci
utf8mb4_0900_ai_ci