我有一个表,其中包含二进制(16)格式的 UUID 列,我需要更新所有旧条目,但未设置该值。尝试查询:
UPDATE sometable SET uuid=UNHEX(REPLACE(UUID(), '-', '')) WHERE uuid IS NULL;
Run Code Online (Sandbox Code Playgroud)
仅更新一行后,它会返回如下错误:
键“uuid”重复条目“\xAD\x15\xEAoT\xAB\x11\xE7\x9B\x0F\xF0yYry\xD5”
有什么方法可以更新所有行吗?我将不胜感激您的帮助...
我遇到了完全相同的问题。最终遇到了一个问题:
如果无法更改数据库字符集,则在图片中添加 CONVERT() 即可解决:
UPDATE sometable SET uuid=UNHEX(REPLACE(CONVERT(UUID() using utf8mb4), '-', '')) WHERE uuid IS NULL;
Run Code Online (Sandbox Code Playgroud)
-------------------------------------------------- - - - 编辑 - - - - - - - - - - - - - - - - - - - - - - -----------------
我找到了另一种方法来解决这个问题,这可能是首选方法。
显然,如果我们知道这一点并且数据库已经设置了正确的字符集和排序规则,我们就不会遇到这些问题。
现在改变这些似乎风险太大,而且可能需要大量工作。因此,下一个最佳选择是通过添加以下选项来定义 JDBC 连接中的连接:
?sessionVariables=character_set_client=utf8mb4,character_set_results=utf8mb4,character_set_connection=utf8mb4,collation_connection=utf8_general_ci
Run Code Online (Sandbox Code Playgroud)
IE:
jdbc:mariadb://localhost/dbName?sessionVariables=character_set_client=utf8mb4,character_set_results=utf8mb4,character_set_connection=utf8mb4,collation_connection=utf8_general_ci
Run Code Online (Sandbox Code Playgroud)