SQL - 在UPDATE QUERY上重复REPELACE(UUID)

时间:2017-06-19 05:39:15

标签: mysql sql mariadb

我有一个表,其中包含二进制(16)格式的UUID列,我需要更新所有旧条目,未设置该值。尝试查询:

UPDATE sometable SET uuid=UNHEX(REPLACE(UUID(), '-', '')) WHERE uuid IS NULL;

在仅更新一行后,它会返回如下错误:

  

重复输入' \ xAD \ x15 \ xEAoT \ xAB \ x11 \ xE7 \ x9B \ x0F \ xF0yYry \ xD5'按键' uuid'

更新所有行的方法有哪些?我将非常感谢你的帮助......

3 个答案:

答案 0 :(得分:0)

UUID()仅对语句进行一次评估。所以所有行(需要更改)都获得相同的值。

您是否愿意与我们分享SHOW CREATE TABLE?我可能会告诉你不要使用uuids。

答案 1 :(得分:0)

我遇到了完全相同的问题。 最终成为一个问题:

  • 数据库字符集
  • 从2.2.4版开始更改MariaDB J / Connector
  • UUID()和String处理函数(例如REPLACE())的组合

如果您不能更改数据库字符集,则将CONVERT()添加到图片即可解决该问题:

UPDATE sometable SET uuid=UNHEX(REPLACE(CONVERT(UUID() using utf8mb4), '-', '')) WHERE uuid IS NULL;

-------------------------------------------- ------------编辑------------------------------------- -----------------------

我找到了另一种解决方法,这可能是首选。

显然,如果我们知道这一点,并且数据库已经设置了正确的字符集和排序规则,那么我们就不会遇到这些问题。

现在更改这些图标似乎太冒险了,可能还有很多工作。 因此,下一个最佳选择是通过添加以下选项来定义JDBC连接中的那些:

?sessionVariables=character_set_client=utf8mb4,character_set_results=utf8mb4,character_set_connection=utf8mb4,collation_connection=utf8_general_ci

即:

jdbc:mariadb://localhost/dbName?sessionVariables=character_set_client=utf8mb4,character_set_results=utf8mb4,character_set_connection=utf8mb4,collation_connection=utf8_general_ci

参考https://jira.mariadb.org/browse/CONJ-417?focusedCommentId=91133&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-91133

https://stackoverflow.com/a/51393124/5154619

答案 2 :(得分:0)

从2.2.4开始,MariaDB连接器使用utf8mb4(4字节上正常的ut8),这不是问题(实际上避免了很多问题...)

问题驻留在MySQL 5.6 / 5.7中。根据排序规则,UUID被错误地评估。使用utf8mb4会出现此问题。 https://i.stack.imgur.com/ICGtX.png那里报告了错误。