如何正确处理mysql中的dakuten和handakuten日文字符?

时间:2016-12-12 17:59:02

标签: mysql unicode utf-8 nscharacterset

声明:

  1. 数据库为$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); }) }
  2. 表格字段为ut8mb4_unicode_520_ci
  3. 如何正确查询包含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来更好地在一个屏幕截图中显示所有内容):

    enter image description here

    有没有一个可靠的方法来处理这些角色?所有其他日文字符似乎工作得很好,它只是dakuten版本被视为只在查询中的基础。

2 个答案:

答案 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