Skip to content

Instantly share code, notes, and snippets.

@stevenmaguire
Last active February 19, 2021 15:36
Show Gist options
  • Save stevenmaguire/1f981b3218bc289b29d6 to your computer and use it in GitHub Desktop.
Save stevenmaguire/1f981b3218bc289b29d6 to your computer and use it in GitHub Desktop.
MySQL function to convert ISBN13 to ISBN10
DROP FUNCTION IF EXISTS `ISBN13to10`;
delimiter //
CREATE FUNCTION `ISBN13to10`(isbn13 VARCHAR(50)) RETURNS varchar(50) CHARSET utf8
BEGIN
DECLARE isbn10 VARCHAR(13);
DECLARE i VARCHAR(13);
DECLARE sum INT;
DECLARE chk INT;
DECLARE chkchar VARCHAR(3);
IF (LENGTH(isbn13) = 10) THEN
RETURN isbn13;
ELSEIF (LENGTH(isbn13) != 13 || SUBSTRING(isbn13, 1, 3) != '978') THEN
RETURN isbn13;
END IF;
SET i = SUBSTRING(isbn13, 4, 10);
IF (LENGTH(i) < 10) THEN
SET i = LPAD(i, 10 , '0');
END IF;
SET sum =
1 * LEFT(i ,1)
+ 2 * RIGHT(LEFT(i ,2),1)
+ 3 * RIGHT(LEFT(i ,3),1)
+ 4 * RIGHT(LEFT(i ,4),1)
+ 5 * RIGHT(LEFT(i ,5),1)
+ 6 * RIGHT(LEFT(i ,6),1)
+ 7 * RIGHT(LEFT(i ,7),1)
+ 8 * RIGHT(LEFT(i ,8),1)
+ 9 * RIGHT(LEFT(i ,9),1);
SET chkchar = 'X';
SET chk = sum % 11;
IF (chk = 10) THEN
SET chk = 90980;
END IF;
IF (chk != 90980) THEN
SET chkchar = CAST(chk as CHAR);
END IF;
RETURN CONCAT(SUBSTRING(isbn13, 4, 9), chkchar);
END //
delimiter ;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment